Lua语言学习:Lua 元表
在 Lua table 中我们可以访问对应的 key 来得到 value 值,但是却无法对两个 table 进行操作(比如相加)
有两个很重要的函数来处理元表
- setmetatable(table, metatable)
- getmetatable(table)
__index
当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
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)