1、Metatable允许我们改变表的行为。
使用 Metatables 我们可以定义 Lua 如何计算两个 table 的相加操作 a+b。当 Lua 试图对两个表进行相加时,他会检查两个表是否有一个表有 Metatable,并且检查 Metatable 是否有__add 域。如果找到则调用这个__add函数(所谓的 Metamethod)去计算结果。
2、任何一个表都可以是其他表的Metatable,多个表可以共享一个Metatable(描述他们共同的行为),一个表也可以是自己的原表(描述它的私有行为)。
3、lua中选择原方法的原则:第一个参数存Metamethod在用第一个参数的Metatable,与第二个参数无关,如果第一个参数不存在,用第二个参数的,都不存在报错。
4、算术域:__add、__mul、__sub、__div、__unm(负)、__pow、__concat(定义连接行为)
5、用法: setmetatable({}, {__index = {}})
6、利用lua中的metatable中的算术域__add,实现两个集合的交集。
-------------代码段-----------------
local Set = {}
Set.Metatable = {}
function Set.new(a)
local tab = {}
for k,v in ipairs(a) do
tab[k] = v
end
setmetatable(tab, Set.Metatable)
return tab
end
-- 定义__add域Metamethod
function Set.addmetamethod(a, b)
local tab = {}
for k,v in ipairs(a) do
tab[k] = v
end
local length = table.getn(tab)
for k,v in ipairs(b) do
tab[length + k] = v
end
return tab
end
-- 打印结果
function Set.printresult(tab)
io.write("{")
for _,v in ipairs(tab) do
io.write(v .. ", ")
end
io.write("}\n")
end
-- 测试结果
Set.Metatable.__add = Set.addmetamethod
local test1 = Set.new({20,10,50})
local test2 = Set.new({11,24,56,73})
test3 = test1 + test2
Set.printresult(test3)
-------------代码段-----------------
温馨提示:
博主原创,请支持原创!
欢迎各位大佬不吝赐教!
联系方式:QQ:844262776
微信:15225601365
|
请发表评论