lua中的metatable(元表),主要用来描述table的行为,好比两个table如何进行算数运算等等。html
咱们能够经过getmetatable方法来获取一个表的元表。ui
t = {}
print(getmetatable(t)) --> nil
复制代码
从上面能够看出,lua在建立一个表的时候,默认的元表是nil,就是没有元表。lua
咱们能够使用下面的方式来给一个表添加元表:spa
t = {}
mt = {}
setmetatable(t, mt)
print(getmetatable(t) == mt) --> true
复制代码
##使用元表来定义连个表的相加操做code
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方法。htm
__add方法用来定义当两个表进行+操做的时候,如何处理。至关于运算符重载。 __tostring方法用来当print输出表的时候,会调用该表的元表中定义的__tostring方法来输出对应的内容。ip
能够看到,例子t1,t2,t3的元表都设置为了mt。文档
上面提到了相加操做,那你确定知道还有-,*,/等各类操做了。get
还有很是多,有须要的时候能够本身实现这些方法。string
所有的方法请参考官方文档: www.lua.org/manual/5.3/…