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

浙公网安备 33010602011771号