我想在Lua中使用一次写入表(特别是LuaJIT 2.0.3),这样: local tbl = write_once_tbl()tbl["a"] = 'foo'tbl["b"] = 'bar'tbl["a"] = 'baz' -- asserts false 理想情况下,这将像常规表(pairs()和ipairs()工作)一样运行. __
local tbl = write_once_tbl() tbl["a"] = 'foo' tbl["b"] = 'bar' tbl["a"] = 'baz' -- asserts false
理想情况下,这将像常规表(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
请注意,__ pairs和__ipairs仅适用于Lua 5.2及更高版本.