13.4.5 只读表

采用代理的思想很容易实现一个只读表。我们需要做得只是当我们监控到企图修改表时候抛出错误。通过__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开发者 - lua论坛