我希望在 Lua(特别是 LuaJIT 2.0.3)中有一个只读表,以便:
local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz' -- asserts false
理想情况下,这应该像普通表格一样运行(pairs()和ipairs()可用)。
__newindex基本上与我希望实现的相反,我不知道如何使用代理表模式使pairs()和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
才能正常工作。
__pairs
和__ipairs
元方法。 - lhf