#Lua 的 setmetatable 函数
setmetatable (table, metatable)
说明
将对象 table
的元表设为 metatable
;如果 table
已有的元表包含 __metatable
字段则会引发错误。
参数
table
- 要设置元表的对象,在 Lua 中必须是表metatable
- 要设置的元表,如果是nil
则移除对象的元表
返回值
- 返回
table
#示例
local t1 = {value = 10}
local t2 = {value = 20}
-- 元表,重载运算符
local metatable = {
__add = function(x, y) return {value = x.value + y.value} end,
__sub = function(x, y) return {value = x.value - y.value} end,
__mul = function(x, y) return {value = x.value * y.value} end,
__div = function(x, y) return {value = x.value / y.value} end,
}
-- 设置元表
setmetatable(t1, metatable)
setmetatable(t2, metatable)
-- 使用
print((t1 + t2).value)
print((t1 - t2).value)
print((t1 * t2).value)
print((t1 / t2).value)
#元表的字段说明
按照惯例,Lua 使用的所有元表键都由两个下划线后跟小写拉丁字母组成。
__add
- 加法(+
)运算符__sub
- 减法(-
)运算符__mul
- 乘法(*
)运算符__div
- 除法(/
)运算符__mod
- 模(%
)运算符__pow
- 指数(^
)运算符__unm
- 负(-
)运算符__idiv
- 向下取整除法(//
)运算符__band
- 按位与(&
)运算__bor
- 按位或(|
)运算符__bxor
- 按位异或(~
)运算符__bnot
- 按位非运算(~
)运算符__shr
- 按位左移(<<
)运算符__shl
- 按位右移(>>
)运算符__concat
- 连接(..
)运算符__len
- 长度(#
)运算符__eq
- 等于(==
)运算符__lt
- 小于(<
)运算符__le
- 小于或等于(<=
)运算符__index
- 索引访问操作table[key]
,当table
不是表或key
字段不存在时,通过这个字段访问__newindex
- 索引赋值操作table[key] = value
,当table
不是表或key
字段不存在时,通过这个字段赋值__call
- 调用参数func(...)
,当func
不是函数时,通过这个字段进行调用__gc
- 对象被垃圾收集时触发__close
- 对象离开作用域时触发__name
- 对象的名称