近日开始频繁使用Lua,于是把这块东西理了一下,特此记录。
Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的。
举例说明:
输出为nil的原因很简单,temptable中并没有memberA这个成员,这符合我们平时对HashMap的认知。但对于Lua表,如果temptable有元表,情况就不同了。
什么是元表:
元表像是一个“ *** 作指南”,里面包含了一系列 *** 作的解决方案,例如__index方法就是定义了这个表在索引失败的情况下该怎么办。
__index元方法:
按照之前的说法,如果A的元表是B,那么如果访问了一个A中不存在的成员,就会访问查找B中有没有这个成员。这个过程大体是这样,但却不完全是这样,实际上,即使将A的元表设置为B,而且B中也确实有这个成员,返回结果仍然会是nil,原因就是B的__index元方法没有赋值。按照我的理解,__index方法是用来确定一个表在被作为元表时的查找方法。这么说有点绕。所以:
举个栗子:)
[plain] view plain copy print ? father = { house=1 } son = { car=1 } setMetatable(son, father) --把son的Metatable设置为father print(son.house) 输出的结果是nil,但如果把代码改为
[plain] view plain copy print ? father = { house=1 } father.__index = father -- 把father的__index方法指向自己 son = { car=1 } setMetatable(son, father) print(son.house)
输出的结果为1,符合预期
这样一来,结合上例,来解释__index元方法的含义:
注:__index方法除了可以是一个表,还可以是一个函数,如果是一个函数,__index方法被调用时将返回该函数的返回值。
到这里,总结一下Lua查找一个表元素时的规则,其实就是如下3个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续 2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续 3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值 总结
以上是内存溢出为你收集整理的Lua查找表元素过程(元表、__index方法是如何工作的)全部内容,希望文章能够帮你解决Lua查找表元素过程(元表、__index方法是如何工作的)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)