在lua写一次表?

时间:2017-11-03 00:29:49

标签: lua lua-table luajit

我想在Lua中使用一次写入表(特别是LuaJIT 2.0.3),以便:

local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz'  -- asserts false

理想情况下,这将像常规表(pairs()和ipairs()一样)起作用。

__ newindex基本上与我想要实现的方法相反,我不知道任何使用pair()和ipairs()使代理表模式工作的技术。

1 个答案:

答案 0 :(得分:5)

您需要使用代理表,即一个捕获对实际表的所有访问权限的空表:

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以后。