元表的基本概念: 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)
本文介绍了Lua中的metatable(元表)概念及其应用。元表是一系列预定义操作,用于定义table的行为,如两个table相加的操作。文章通过示例代码详细解释了如何设置元表以及如何利用元表实现自定义操作。
892

被折叠的 条评论
为什么被折叠?



