在 lua 中写入一次 table?
Write-once table in lua?
我想在 Lua(特别是 LuaJIT 2.0.3)中写入一次 table,以便:
local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz' -- asserts false
理想情况下,这将像常规 table 一样运行(pairs() 和 ipairs() 工作)。
__newindex 基本上与我想要轻松实现的相反,我不知道任何使代理 table 模式与 pairs() 和 ipairs( ).
您需要使用代理 table,即捕获对实际 table:
的所有访问的空 table
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 之后的版本。
我想在 Lua(特别是 LuaJIT 2.0.3)中写入一次 table,以便:
local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz' -- asserts false
理想情况下,这将像常规 table 一样运行(pairs() 和 ipairs() 工作)。
__newindex 基本上与我想要轻松实现的相反,我不知道任何使代理 table 模式与 pairs() 和 ipairs( ).
您需要使用代理 table,即捕获对实际 table:
的所有访问的空 tablefunction 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 之后的版本。