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

成为Lua高手之metatable

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

metatable是我用Lua语言一段时间都没有搞的很明白的东西。

再次遇到,就决心要和metatable叙叙感情。

首先谈谈元方法metaFunction有哪些:

add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, index, newindex, call...

使用的时候记得在元方法前面加上2条下划线:例如:index  ->   __index

说说__index的使用:

local t1 = {}
function t1.showInfo()
  print("t1.showInfo Method~")
end

local t2 = {}
setmetatable(t2, {__index = t1})
t2.showInfo()

上面的代码我创建了2个表t1,t2.

将{__index = t1}设置为t2的metatable.

这个时候调用t2的showInfo方法,可以看到的结果是:

突然间,有没有一种继承的感觉:P

程序的运作大概是这样的:

程序首先找t2的showInfo方法,结果没找到,然后看t2有元表存在,

然后根据t2元表中的__index属性的找到t2的"父类"t1表,并且找到了showInfo方法,故调用之。

再看如何通过__index创建我们自己的类。看代码:

local Car = {}

Car.__index = Car 

function Car:new( o )
  o = o or {}
  setmetatable(o, Car)
  return o
end

function Car:run()

end

...

...

...

分析上面的代码是如何创建我们自己的一个类,首先是创建了Car的table表,然后把Car的table表的__index设置为自己本身。

然后在假如我们需要创建一个新的类,local myCar = Car.new()

我们在Car的new方法中的工作是,需要注意的是:

我们传了一个参数o,这个o就是Car的self原型,也就是上面我们创建的: local Car = {}  这张表,

如果o不存在,就新建一个o的空表,然后将o的metatable设置为Car,其实上面的代码,

可以合并成一个:

setmetatable(o,{__index = Car})

上面的一句话,相当于o表已经继承了父类Car了,当o类中没有的方法时,他会去父类Car中找。

所以当我们调用myCar.run();时,就可以成功的调用Car的run方法了。

回过头来,想想metatable。

作为一个table,总有他的metatable的,当我们的table进行相关运算处理时,会寻求metatable的帮助,如果metatable能帮助table

来解决问题,那是最好不过了。

table是一棵树,那么metatable就好似树的影子,他们是分主次关系的。

看大神的说法是:”树“叫做本表,”树“的影子叫做虚表。感觉更准确哦~

继续干活了。。。还想继续深层探讨,但是。。。下次遇到再学习~

 


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
Lua多变长参数传递之三点(...)发布时间:2022-07-22
下一篇:
lua和cs交互优化发布时间: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