LUA教程表相关的Metamethods 只读表 -58

采用代理的思想很容易实现一个只读表。 我们需要做得只是当我们监控到企图修改表时候抛出错误。通过__index metamethod,我们可以不使用函数而是用原始表本身来使用表,因为我们不需要监控查寻。这是比较简单并且高效的重定向所有查询到原始表的方法。但是,这种用法要求每一个只读代理有一个单独的新的metatable,使用__index指向原始表:

function readOnly (t)
    local proxy = {}
    local mt = {         -- create metatable
       __index = t,
       __newindex = function (t,k,v)
           error("attempt to update a read-only table", 2)
       end
    } 
 
    setmetatable(proxy, mt)
    return proxy
end

(error的第二个参数2,将错误信息返回给企图执行update的地方)作为一个简单的例子,我们对工作日建立一个只读表:

days = readOnly{"Sunday", "Monday", "Tuesday", "Wednesday",
 
       "Thursday", "Friday", "Saturday"}
 
print(days[1])       --> Sunday
days[2] = "Noday"
stdin:1: attempt to update a read-only table

原文:LUA一个小巧脚本语言学习笔记

           LUA教程表相关的Metamethods 只读表 -58

猜你喜欢

转载自blog.csdn.net/zcp528/article/details/107376312
58
58A