之前以为实现真正的只读表需要改底层实现 __assign 原表覆盖 原方法,现在发现不用
但是相较于,改底层负担每个表都会 附加一个空表 并且有一个大的hash 表消耗
每次使用 pairs 也会有一个闭包创建的消耗
local funs = {
__metatable = true,
__newindex = true,
__tostring = true,
__assign = true,
__concat = true,
__index = true,
__pairs = true,
__call = true,
__len = true,
__add = true,
__div = true,
__mod = true,
__unm = true,
__pow = true,
__pow = true,
__eq = true,
__lt = true,
}
---弱引用无效-暂时不知道原因
local tabs = setmetatable({}, { __mod = "kv" })
local meta = {}
function meta.__index(t, k)
return tabs[t][k]
end
function meta.__newindex(t, k, v)
assert(false, "read only")
end
function meta.__len(t)
return rawlen(tabs[t])
end
function meta.__pairs(t)
return function(t, k)
local v
repeat
k, v = next(tabs[t], k)
if not funs[k] then
break
end
until false
return k, v
end, t, nil
end
local function localf(tab)
local new = {}
tabs[new] = tab
return setmetatable(new, meta)
end
return localf