2017-11-03 17 views
4

내가 루아에서 회 기록 테이블이 싶습니다 (특히 2.0.3을 LuaJIT), 그래서 :루아의 Write Once 테이블?

local tbl = write_once_tbl() 
tbl["a"] = 'foo' 
tbl["b"] = 'bar' 
tbl["a"] = 'baz' -- asserts false 

이상적으로,이 그렇지 않은 일반 테이블 (쌍()와 ipairs (같은 기능을 것입니다) 일).

__newindex는 기본적으로 쉽게 구현할 수있는 것과 반대이며 쌍()과 ipairs()를 사용하여 프록시 테이블 패턴 작업을 수행하는 기술을 인식하지 못합니다. __pairs__ipairs은 이후 루아 5.2에서 작동하는지

function write_once_tbl() 
    local T={} 
    return setmetatable({},{ 
     __index=T, 
     __newindex= 
      function (t,k,v) 
       if T[k]==nil then 
        T[k]=v 
       else 
        error("table is write-once") 
       end 
      end, 
     __pairs= function (t) return pairs(T) end, 
     __ipairs= function (t) return ipairs(T) end, 
     }) 
end 

참고 :

답변

5

당신은 프록시 테이블, 실제 테이블에 대한 모든 액세스를 캐치 빈 테이블을 사용해야합니다.

+0

프록시 테이블은 알고 있지만 pairs() 또는 ipairs()는 사용하지 않습니다. 방금 코드 조각을 시도하고 쌍() 및 ipairs()가 작동하지 않는지 확인했습니다. – MikeMx7f

+0

@ MikeMx7f, 그들은 루아 5.2와 5.3에서합니다. – lhf

+0

나는 Lua 5.3을 사용하는 https://www.lua.org/cgi-bin/demo에서 코드 스 니펫을 테스트했다. – MikeMx7f