第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些区别。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目。
用 Lua 编程 | ||
第二部分。表和对象 第 13 章。元表和元方法 |
一些库定义元表中的自己的字段是一种常见做法。到目前为止,我们看到的所有元方法都属于 Lua 核心。虚拟机检测到操作中涉及的值具有元表,并且这些元表为该操作定义了元方法。但是,由于元表是常规表,因此任何人都可以使用它。
tostring
函数提供了一个典型的示例。如前所述,tostring
以相当简单的格式表示表
print({}) --> table: 0x8062ac0(请注意,
print
始终调用 tostring
来格式化其输出。)但是,在格式化对象时,tostring
首先检查对象是否具有带有 __tostring
字段的元表。如果是这种情况,tostring
调用相应的值(必须是函数)来完成其工作,并将对象作为参数传递。此元方法返回的任何内容都是 tostring
的结果。
在我们使用集合的示例中,我们已经定义了一个函数将集合表示为字符串。因此,我们只需要在集合元表中设置 __tostring
字段
Set.mt.__tostring = Set.tostring在那之后,每当我们使用集合作为其参数调用
print
时,print
调用 tostring
,而 tostring
调用 Set.tostring
s1 = Set.new{10, 4, 5} print(s1) --> {4, 5, 10}
setmetatable
/getmetatable
函数也使用元字段,在这种情况下用于保护元表。假设您想保护您的集合,以便用户既看不到也无法更改它们的元表。如果您在元表中设置 __metatable
字段,getmetatable
将返回此字段的值,而 setmetatable
将引发错误
Set.mt.__metatable = "not your business" s1 = Set.new{} print(getmetatable(s1)) --> not your business setmetatable(s1, {}) stdin:1: cannot change protected metatable
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |