美文网首页cocos2d-Lua
Lua查找表元素过程(元表、__index方法是如何工作的)

Lua查找表元素过程(元表、__index方法是如何工作的)

作者: fan1990 | 来源:发表于2016-07-15 10:43 被阅读138次

转自 http://blog.csdn.net/xocoder/article/details/9028347

近日开始频繁使用Lua,于是把这块东西理了一下,特此记录。Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会**触发Lua的一套查找机制,也是凭借这个机制来模拟了类似“类”的行为

tempTable = {}
print(tempTable.memberA) --这里试图打印tempTable并不存在的成员memberA

执行结果:nil输出为nil的原因很简单,tempTable中并没有memberA这个成员,这符合我们平时对HashMap的认知。但对于Lua表,如果tempTable有元表,情况就不同了。

什么是元表:元表像是一个“操作指南”,里面包含了一系列操作的解决方案,例如__index方法就是定义了这个表在索引失败的情况下该怎么办。

__index元方法:按照之前的说法,如果A的元表是B,那么如果访问了一个A中不存在的成员,就会访问查找B中有没有这个成员。这个过程大体是这样,但却不完全是这样,实际上,即使将A的元表设置为B,而且B中也确实有这个成员,返回结果仍然会是nil,原因就是B的__index元方法没有赋值。别忘了我们之前说过的:“元表是一个操作指南”,定义了元表,只是有了操作指南,但不应该在操作指南里面去查找元素,而__index方法则是“操作指南”的“索引失败时该怎么办”。这么说有点绕。所以:

father = {
house=1
}
son = {
car=1
}
setmetatable(son, father) --把son的metatable设置为father
print(son.house)

输出的结果是nil,但如果把代码改为

father = {
house=1
}
father.__index = father -- 把father的__index方法指向自己
son = {
car=1
}
setmetatable(son, father)
print(son.house)

输出的结果为1,符合预期

这样一来,结合上例,来解释__index元方法的含义:
在上述例子中,访问son.house时,son中没有house这个成员,但Lua接着发现son有元表father,注意:此时,Lua并不是直接在father中找名为house的成员,而是调用father的__index方法,如果__index方法为nil,则返回nil,如果是一个表(上例中father的__index方法等于自己,就是这种情况),那么就到__index方法所指的这个表中查找名为house的成员,于是,最终找到了house成员。注:__index方法除了可以是一个表,还可以是一个函数,如果是一个函数,__index方法被调用时将返回该函数的返回值。

到这里,总结一下Lua查找一个表元素时的规则,其实就是如下3个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表(操作指南),如果没有元表,返回nil,有元表则继续
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值

相关文章

  • Lua查找表元素过程(元表、__index方法是如何工作的)

    转自 http://blog.csdn.net/xocoder/article/details/9028347 近...

  • lua metatable __nexindex方法

    __index元方法是访问,如果表中没有就会进元方法查找(如果有元表的话),如果元方法是表,返回元表的元素;如果元...

  • Lua实现继承的方法

    lua通过元表实现继承 lua查找一个表元素的规则如下 1.在表中查找,如果找到,则返回这个元素 2.判断该表是否...

  • Lua实现继承

    Lua元表使用 中的__index元方法可以实现面向对象和继承关系: lua中没有类的概念,只有table,但可以...

  • Lua中元表的学习

    Lua本身没有面向对象的思想,但是可以根据表、元表、元方法来靠近它 一、元表与元方法的概念Lua中每个值都可具有元...

  • Lua实现KVO

    Lua元表使用 __index和__newindex方法有点类似get和set方法,可以利用这个特性实现监听tab...

  • 查找

    静态查找表:只作查找操作的查找表 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经...

  • Lua 实现面向对象 (原创)

    要理解Lua是如何实现面向对象的。首先要熟悉Lua元表的相关知识,可以阅读我上一篇文章《Lua元表 (Metata...

  • 跟诸子学游戏 Lua学习

    Lua查找一个表元素时的规则,其实就是如下3个步骤: 1.在表中查找,如果找到,返回该元素,找不到则继续 2.判断...

  • Lua index 和 newindex 元方法

    上一篇文章简单介绍了 Lua 中的元表和元方法,那么在这里就接着重点讲解一下 Lua 中的 index 和 new...

网友评论

    本文标题: Lua查找表元素过程(元表、__index方法是如何工作的)

    本文链接:https://www.haomeiwen.com/subject/tmdyjttx.html