Lua语言学习:Lua 元表

在 Lua table 中我们可以访问对应的 key 来得到 value 值,但是却无法对两个 table 进行操作(比如相加)
更新于: 2022-01-25 07:44:21

有两个很重要的函数来处理元表

  • setmetatable(table, metatable)
  • getmetatable(table)

__index

当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

__index 设置不存在的属性
local mytable = {}
local opts = {
    name = "aric"
}
setmetatable(mytable, {
    __index = opts
})

print(mytable.name)
print(mytable.otherprops)

解析

  • mytable 表赋值为 {key1 = "value1"}。
  • mytable 设置了元表,元方法为 __index。

__newindex

local mytable = setmetatable({
    key1 = "value1"
}, {
    __newindex = function(mytable, key, value)
        rawset(mytable, key, "\"" .. value .. "\"")
    end
})

-- 这里是更新,不会走到那个逻辑里去
mytable.key1 = "new value"
-- 这个是new__index 会走到 __newindex 逻辑里去
mytable.key2 = 4

print(mytable.key1, mytable.key2)

算术操作元操作

模式描述
__add对应的运算符 '+'.
__sub对应的运算符 '-'.
__mul对应的运算符 '*'.
__div对应的运算符 '/'.
__mod对应的运算符 '%'.
__unm对应的运算符 '-'.
__concat对应的运算符 '..'.
__eq对应的运算符 '=='.
__lt对应的运算符 '<'.
__le对应的运算符 '<='.

__call

__call 元方法在 Lua 调用一个值时调用

__toString

__tostring 元方法用于修改表的输出行为

local mytable = setmetatable({10, 20, 30}, {
    __tostring = function(mytable)
        local sum = 0
        for k, v in pairs(mytable) do
            sum = sum + v
        end
        return "表所有元素的和为 " .. sum
    end
})

print(mytable)

参考