lua只读表-不需要改底层的方法

之前以为实现真正的只读表需要改底层实现 __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

你可能感兴趣的:(lua,lua,开发语言)