元表的功能可以理解为为table进行一些功能的扩展,或者运算符的重载。
mytable = {} --表
metatable = {} --元表
setmetatable(mytable,metatable) --设置metatable是mytable的元表
__index元方法
如果通过键访问table,但是没有value值时会调用这个方法,table和键作为参数,去执行这个方法。
mytable = setmetatable({key1 = "value1"}, {
__index = function(mytable, key)
if key == "key2" then
return "metatablevalue"
else
return nil
end
end
})
print(mytable.key1,mytable.key2)
输出:value1,metatable
__newindex 元方法
当对一个table的键进行赋值的时候,如果该 table存在这个键就会进行更新不访问__newindex如果没有存在这个键,就会访问__newindex访问,把table和值作为的参数传递。
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })
print(mytable.key1)
mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)
mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)
输出:value1
nil 新值2
新值1 nil
为表添加运算符(可以理解为运算符的重载):
__add对应的运算符 '+'.
__sub对应的运算符 '-'.
__mul对应的运算符 '*'.
__div对应的运算符 '/'.
__mod对应的运算符 '%'.
__unm对应的运算符 '-'.
__concat对应的运算符 '..'.
__eq对应的运算符 '=='.
__lt对应的运算符 '<'.
比如求和_call元方法
-- 自定义计算表中最大键值函数 table_maxn,即计算表的元素个数
function table_maxn(t)
local mn = 0
for k, v in pairs(t) do
if mn < k then
mn = k
end
end
return mn
end
-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {
__add = function(mytable, newtable)
for i = 1, table_maxn(newtable) do
table.insert(mytable, table_maxn(mytable)+1,newtable[i])
end
return mytable
end
})
secondtable = {4,5,6}
mytable = mytable + secondtable
for k,v in ipairs(mytable) do
print(k,v)
end