• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua中的元表Metatable ——1

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Nginx利用lua剪辑FastDFS图片发布时间:2022-07-22
下一篇:
lua范性for的语义发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap