Mik*_*x7f 5 lua luajit lua-table
我想在Lua中使用一次写入表(特别是LuaJIT 2.0.3),这样:
local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz' -- asserts false
Run Code Online (Sandbox Code Playgroud)
理想情况下,这将像常规表(pairs()和ipairs()工作)一样运行.
__newindex基本上与我想要实现它的方法相反,我不知道任何使用pair()和ipairs()使代理表模式工作的技术.
您需要使用代理表,即一个捕获对实际表的所有访问权限的空表:
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
Run Code Online (Sandbox Code Playgroud)
请注意,__pairs
并__ipairs
从Lua 5.2起才起作用.