metatable
lua中的metatable(元表),主要用来描述table的行为,比如两个table如何进行算数运算等等。
我们可以通过getmetatable方法来获取一个表的元表。
t = {}
print(getmetatable(t)) --> nil
从上面可以看出,lua在创建一个表的时候,默认的元表是nil,就是没有元表。
我们可以使用下面的方式来给一个表添加元表:
t = {}
mt = {}
setmetatable(t, mt)
print(getmetatable(t) == mt) --> true
##使用元表来定义连个表的相加操作
t1 = {10, 20}
t2 = {30, 40}
mt = {
__add = function(a, b)
local res = {}
local k = 1
for _,v in ipairs(a) do
res[k] = v;
k = k+1
print(k .. v)
end
for _,v in ipairs(b) do
res[k] = v
k = k+1
print(k .. v)
end
return res
end,
__tostring = function(t)
local res = ""
for k,v in ipairs(t) do
res = res .. k .. ':' .. v .. '\n';
end
return res
end
}
setmetatable(t1, mt)
setmetatable(t2, mt)
t3 = t1 + t2
setmetatable(t3, mt)
print(t3)
-- 1:10
-- 2:20
-- 3:30
-- 4:40
上面这个例子,我们定义了两个表和一个元表,然后元表里面定义了__add方法和__tostring方法。
__add方法用来定义当两个表进行+操作的时候,如何处理。相当于运算符重载。 __tostring方法用来当print输出表的时候,会调用该表的元表中定义的__tostring方法来输出对应的内容。
可以看到,例子t1,t2,t3的元表都设置为了mt。
其他一些元表的操作
上面提到了相加操作,那你肯定知道还有-,*,/等各种操作了。
__sub(减)
__mul(乘)
__div(除)
还有非常多,有需要的时候可以自己实现这些方法。
全部的方法请参考官方文档: www.lua.org/manual/5.3/…