在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
可以参考 http://blog.csdn.net/xenyinzen/article/details/3536708
来源 http://blog.csdn.net/fishe_r/article/details/77530369
最近学习lua今天突然对metatable和__index之间的关系有点不清楚,上网查了下加深了对metatable的理解,记录一下 还是用代码来解释,下面有图解,metatable和__index主要用于继承相关,有两种方式: test.lua
test2.lua
上面的代码test.lua中t1,t2都能访问到new和say方法,但是test2中只有直接通过test2:new()生成的对象(t3)才能访问new和say方法,而通过test2:new()生成的子对象生成的对象(t4)则访问不到new和say方法 要解释上述问题,首先要知道lua从table中查找一个key时的流程,当从表t中查找k时:
所以我们一步步分析test.lua中的代码:
这一句就是创建了一个table,我们用方块表示table则就是下面这样: 接下来实例化一个对象:
这里调用test:new(),相当于test.new(test),函数中的self为test,所以这一步改变了test表,结果用图表示为: 再来看最后一步
此时结果为: 再来看test2.lua中有什么不同,同理按照上面的分析有三个图,就不一一解释了 唯一不同的地方就在于__index方法的设置,在test2.lua中 __index只在test2表中设置,在继承过程中,并没有设置对应的__index方法,所以t3可以访问到new和say,但是t4则不可以 不过由此引出我一个问题,我们可以看到lua中查找不存在的k时,最终起作用的其实是__index方法,类似的还有操作符元方法等,但是却要先找metatable,然后找metatable里面的这些元方法,metatable在这里是相当于一个代理一样的作用,那么为什么不能直接在自身的表中设置,为什么要有metatable这个中间表?? 猜想一:可能是模块化的考虑也就是把这些元方法集中在一起
猜想二:可能是为了多个table方便共享同一个metatable
猜想三:刚刚想到如果没有metatable的话,直接用__index指向要设置的元表,那么如果我想把自身作为基类,用__index指向自身,就会陷入死循环
所以不清楚这部分的设计理念是什么,如果有知道的可以留言下
|
请发表评论