lua에서 읽기 전용 테이블을 어떻게 구현할 수 있습니까?

니클라우스 쳉

나는 예를 썼다.

 function readOnly(t)  
      local newTable = {}  
      local metaTable = {}  
      metaTable.__index = t  
      metaTable.__newindex = function(tbl, key, value)   error("Data cannot be changed!")   end  
      setmetatable(newTable, metaTable)  
      return newTable  
  end

 local tbl = {
    sex = {
        male = 1,
        female = 1,
    },
    identity = {
        police = 1,
        student = 2,
        doctor = {
            physician = 1,
            oculist = 2,
        }
    }
 } 

 local hold = readOnly(tbl)
 print(hold.sex)
 hold.sex = 2   --error

이는 "tbl"테이블의 필드에 대한 액세스 권한을 부여 할 수 있지만 동시에 필드와 관련된 값을 변경할 수 없음을 의미합니다.

이제 문제는 중첩 된 모든 테이블이이 읽기 전용 속성을 소유하게하려는 것입니다. "readOnly"메서드를 어떻게 개선 할 수 있습니까?

Siffiejoe

readOnly내부 테이블 필드에도 함수를 재귀 적 으로 적용하면됩니다 . __index메타 메서드 에서 온 액세스로 그렇게 할 수 있습니다 . 또한 생성 한 읽기 전용 프록시 테이블을 캐시해야합니다. 그렇지 않으면 내부 테이블 (예 :)에 대한 읽기 액세스가 hold.sex새 프록시 테이블을 생성합니다.

-- remember mappings from original table to proxy table
local proxies = setmetatable( {}, { __mode = "k" } )

function readOnly( t )
  if type( t ) == "table" then
    -- check whether we already have a readonly proxy for this table
    local p = proxies[ t ]
    if not p then
      -- create new proxy table for t
      p = setmetatable( {}, {
        __index = function( _, k )
          -- apply `readonly` recursively to field `t[k]`
          return readOnly( t[ k ] )
        end,
        __newindex = function()
          error( "table is readonly", 2 )
        end,
      } )
      proxies[ t ] = p
    end
    return p
  else
    -- non-tables are returned as is
    return t
  end
end

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

모든 데이터를 읽고 다른 테이블을 쓰기 위해 C #에서이 계획을 어떻게 구현할 수 있습니까?

조건부로 테이블 행에 읽기 전용 속성을 어떻게 만들 수 있습니까?

iOS 앱에서이 기능을 어떻게 구현할 수 있습니까?

Razor에서 읽기 전용 속성을 어떻게 설정할 수 있습니까?

TypeScript에서 읽기 전용 속성을 어떻게 변경할 수 있습니까?

C에서 기본 대기열을 어떻게 구현할 수 있습니까?

이 Rust 특성에 대해 동일한 기본 구현을 어떻게 사용할 수 있습니까?

Angular에서 인쇄 기능을 어떻게 구현할 수 있습니까?

데이터 테이블에 "행 추가"기능을 어떻게 사용할 수 있습니까?

일부 MediaWiki 마크 업 (여기 : 테이블)을 템플릿에 어떻게 전달할 수 있습니까?

Enter 키를 누르면 쿼리 기준에 전체 테이블을 어떻게 표시할 수 있습니까?

Dapper는 읽기 전용 속성을 어떻게 설정할 수 있습니까?

포인트 척도에 대한 반전 기능을 어떻게 구현할 수 있습니까?

최대 절전 모드에서 테이블을 읽기 전용으로 처리 할 수 있습니까?

여러 테이블에 삽입을 어떻게 사용할 수 있습니까?

C에서 함수 조회 테이블을 어떻게 구현할 수 있습니까?

Flask에서 MIXIN을 어떻게 구현할 수 있습니까?

해시 테이블에서 키에 대한 반복을 어떻게 구현할 수 있습니까?

Android에서 sqlite3 가상 테이블 모듈을 어떻게 구현할 수 있습니까?

react-virualised를 사용하여 테이블에서 무한 스크롤을 어떻게 구현할 수 있습니까?

PySpark를 사용하여 기존 임시 테이블에서 json 인 문자열을 어떻게 구문 분석 할 수 있습니까?

Corona와 Lua에서 "id = tostring (i)"을 어떻게 사용할 수 있습니까?

Laravel의 Eloquent를 사용하여 단일 테이블 상속을 어떻게 구현할 수 있습니까?

값이 비동기 인 경우 함수에서 ngModel 이전 값을 어떻게 사용할 수 있습니까?

테이블에있는 기본 뷰를 얻기 위해 hitTest를 어떻게 사용할 수 있습니까?

Shiny 테이블 헤더에서 기호를 어떻게 사용할 수 있습니까?

tabview에서 탭을 변경할 때 어떻게 전환을 구현할 수 있습니까?

읽기 전용 액세스 권한 만있는 경우 어떻게 Ansible을 사용할 수 있습니까?

Chrome에서 커서 잡기 아이콘을 어떻게 구현할 수 있습니까?

TOP 리스트

뜨겁다태그

보관