Lua:只读表的实现

__index:当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

__newindex:当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
__newindex 元方法对表更新操作:创建并返回空表 proxy, 重写 __newindex 使其一直保持空表形式。使得赋值操作都会触发其 __newindex元方法。新插入的数据被添加到readonly_table表中:__index 从readonly_table 表中取出已有数据,__read_only_proxy 是为避免重复的read_only 设置
travelled_tables:为避免表之间的互相引用

实现代码:

ReadOnly = {}

local function __mode_table(tbl, mode)
    local travelled_tables = {}
    if not travelled_tables[tbl] then
        local tbl_mt = getmetatable(tbl)
        if not tbl_mt then
            tbl_mt = {}
            setmetatable(tbl, tbl_mt)
        end

        local proxy = tbl_mt.__read_only_proxy

        -- body
        if not proxy then
            proxy 

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