#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- 对象的名称