元表的功能可以理解为为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