Lua 中的只写表?

我想在 Lua 中(特别是 LuaJIT 2.0.3)拥有一个只写表,使得:

local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz'  -- 断言失败

理想情况下,这应该像普通表一样运行(pairs() 和 ipairs() 可用)。

__newindex 基本上是我想要的相反,我不知道有没有任何技术可以使代理表模式与 pairs() 和 ipairs() 一起工作。

点赞
用户107090
用户107090

你需要使用代理表,也就是一个空表来捕捉对实际表的所有访问:

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 及以上版本中可用。

2017-11-03 15:55:36