在 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 之后的版本。