元表的基本概念: metatable 元表是table 预定义的一系列操作。 例如 将两个table相加,Lua会先去检查这两个table是否有metatable。然后再检查metatable中是否有__add方法。如果其中一个有则按__add中的方法来执行,都没有则报错。
-- Lua中的每一个值都有或者可以有一个元表。在我的理解中,元表可以是函数,也可以是自定义的属性(修正:在设置元表时一般都是传入方法,根据预定义操作这句话的理解。 而我理解的属性,是在__index方法中的)。
-- 注意: Lua在新建的table的时候是不会创建元表的,需要使用setmetatable方法设置元表。
setmetatable(a,b) ------a是需要设置元表的对象, b是元表的值(可以是任何值)
getmetatable(a) ----- 可以查询a是否有元表。
例子:
Bag = {}
function Bag.new(x)
local bag = {}
for i,v in ipairs(x) do
bag[v] = v
end
----这里开始为Bag的实例对象设置元表。设置的元表是一个方法, 名字为__add---------方法的行为是addmeta函数内的操作。
Bag.mymetatable = {}
Bag.mymetatable.__add = Bag.addmeta
setmetatable(bag,Bag.mymetatable)
return bag
end
function Bag.addmeta(a,b)
local outTable = Bag.new({})
for i,v in pairs(a) do
outTable[v] = v
end
for i,v in pairs(b) do
outTable[v]= v
end
return outTable
end
local a = Bag.new({1,2,3,4}) --{1,2,3,4}
local b = Bag.new({5,6,7,8})--{5=5,6=6,7=7,8=8}
local mt = getmetatable(a) --__add:function: 0x14014e40
local mt = getmetatable(b) --__add:function: 0x14014e40
local c = a+b
printt(c)