此第一版专为 Lua 5.0 编写。虽然在很大程度上仍然适用于后续版本,但存在一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
通过购买本书,您还将帮助支持 Lua 项目


13.4.5 – 只读表

很容易采用代理的概念来实现只读表。我们所要做的就是每当我们跟踪任何更新表的尝试时引发一个错误。对于 __index 元方法,我们可以使用一个表(原始表本身)而不是一个函数,因为我们不需要跟踪查询;将所有查询重定向到原始表更简单、更高效。但是,这种用法要求为每个只读代理创建一个新的元表,其中 __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 将错误消息定向到尝试更新的位置。)作为使用示例,我们可以为工作日创建一个只读表
    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