推荐答案
在 Lua 中,常用的 metamethod 包括:
__index
: 当访问表中不存在的键时触发。__newindex
: 当给表中不存在的键赋值时触发。__add
: 定义表的加法操作。__sub
: 定义表的减法操作。__mul
: 定义表的乘法操作。__div
: 定义表的除法操作。__mod
: 定义表的取模操作。__pow
: 定义表的幂运算操作。__unm
: 定义表的取负操作。__concat
: 定义表的连接操作。__eq
: 定义表的相等比较操作。__lt
: 定义表的小于比较操作。__le
: 定义表的小于等于比较操作。__call
: 当表被当作函数调用时触发。__tostring
: 当表被转换为字符串时触发。__metatable
: 用于保护元表,防止被修改。
本题详细解读
1. __index
和 __newindex
__index
和 __newindex
是 Lua 中最常用的 metamethod 之一。__index
用于处理表中不存在的键的访问,而 __newindex
用于处理表中不存在的键的赋值操作。这两个 metamethod 通常用于实现继承、默认值等功能。
-- -------------------- ---- ------- ----- - - -- ----- -- - - ------- - --------------- ---- ------ -------- ------ ---- ---------- - --------------- ---- ------ ------------- ---- ----- - -- --- - --------------- --- --------------------------- -- --- ------- ----- ------------ - -- ------------------- -- --- --
2. 算术操作的 metamethod
Lua 允许通过 metamethod 来定义表的算术操作。例如,__add
用于定义加法操作,__sub
用于定义减法操作,等等。
-- -------------------- ---- ------- ----- -- - - ----- - -- - ----- -- - - ----- - -- - ----- -- - - ----- - ----------- -- ------ - ----- - ------- - ------- - --- - ---------------- --- ---------------- --- ----- ------ - -- - -- ------------------- -- --- --
3. 比较操作的 metamethod
Lua 中的比较操作也可以通过 metamethod 来定义。__eq
用于定义相等比较,__lt
用于定义小于比较,__le
用于定义小于等于比较。
-- -------------------- ---- ------- ----- -- - - ----- - -- - ----- -- - - ----- - -- - ----- -- - - ---- - ----------- -- ------ ------- - ------- --- - ---------------- --- ---------------- --- -------- - --- -- --- ----
4. __call
和 __tostring
__call
允许表被当作函数调用,而 __tostring
允许表被转换为字符串。
-- -------------------- ---- ------- ----- - - -- ----- -- - - ------ - --------------- ---- ------------- ---- --------- - -- ---- ---- ---------- - --------------- ------ ----- -- - ------ --- - --------------- --- ---------- -- --- ------ ---- --------- ----- -------- -- --- ---- -- - -----
5. __metatable
__metatable
用于保护元表,防止其被修改。一旦设置了 __metatable
,尝试获取或设置元表时,将返回 __metatable
的值。
-- -------------------- ---- ------- ----- - - -- ----- -- - - ----------- - ---------- ---------- - --------------- --- ---------------------- -- --- --------- --------- --------------- --- -- --- ------ ------ - --------- ---------