此第一版专为 Lua 5.0 编写。虽然在很大程度上仍然适用于后续版本,但存在一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
通过购买本书,您还将帮助支持 Lua 项目。
![]() |
Lua 中的编程 | ![]() |
| 第二部分。表和对象 第 13 章。元表和元方法 |
很容易采用代理的概念来实现只读表。我们所要做的就是每当我们跟踪任何更新表的尝试时引发一个错误。对于 __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
| 版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 | ![]() |