table只读

初始化的地方

table.raw_pairs = _G.pairs

_G.pairs = function(tb)
    if tb.__invoke then
        return tb._invoke(table.raw_pairs)
    end
    return table.raw_pairs(tb)
end

 

function ReadonlyWrap(data)
    local proxy = {}
    proxy.__index = data
    proxy.__newindex = function(tb, k, v)
        error("table read only!")
    end
    setmetatable(proxy, proxy)
    proxy.__invoke = function(func)
        return func(data)
    end
    return proxy
end

使用场景,比如使用lua作为配置表, 为了防止手误不小心改了配置表的值而引起bug,可以将配置表包装为只读。

 

注意

包装后的table无法通过#arr来获取到长度

local data = ReadonlyWrap({1, 2, 3})

for i, v in ipairs(data) do --可以遍历
    print(i, v)
end

for k, v in pairs(data) do --可以遍历
    print(k, v)
end

print(#data) --结果为0, 获取不到长度

 

解决办法:proxy上加一个len函数来获取长度

proxy.len = function()
    return #data
end

 

posted @ 2021-12-23 22:45  yanghui01  阅读(84)  评论(0)    收藏  举报