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

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

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,于是此时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方法是一个函数,则返回该函数的返回值

时间: 2024-08-07 08:39:54

Lua查找表元素过程(元表、__index方法是如何工作的)(转载)的相关文章

Lua查找表元素过程(元表、__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.hou

数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找.本篇博客会给出相应查找算法的示意图以及相关代码,并且给出相应的测试用例.当然本篇博客依然会使用面向对象语言Swift来实现相应的Demo,并且会在github上进行相关Demo的分享. 查找在生活中是比较常见的,本篇博客所涉及的这几种查找都是基于线性结构的查找.也就是说我们的查找表是一个线性表,我

jquery查找父元素、子元素(个人经验总结)

使用js或者jquery查找父元素.子元素经常遇到.可是用起来总容易混淆,这里统一总结了一下,以后用起来相信会方便好多 这里jquery向上查找父元素 用到的方法:closest() parents() parent() 向下查找子元素 用到的方法:find() children() js用的是 children[] 属性 html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "htt

查找表_leetcode220

# 解题思路:用查找表(集合),保存其K个值的状态 遍历查找表时加上了限制条件T 20190302 找工作期间 class Solution(object): def containsNearbyAlmostDuplicate(self, nums, k, t): """ :type nums: List[int] :type k: int :type t: int :rtype: bool """ if len(nums) <= 1: r

【quick-cocos2d-x】Lua 面向对象(OOP)编程与元表元方法

版权声明:本文为博主原创文章,转载请注明出处. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 早期的计算机编程是基于面向过程的方法,通过设计一个算法就可以解决当时的问题.随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题.面向过程式的编程思想很难良好的解决这些复杂的问题,通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析.设计与编程.同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统.  但是

OpenCV扫描图像、利用查找表和计时的方法

对于一副图像,如果矩阵元素存储的是单通道像素,使用C或C++的无符号字符类型,那么像素可有256个不同值.但若是三通道图像,这种存储格式的颜色数就太多了(确切地说,有一千六百多万种).用如此之多的颜色可能会对我们的算法性能造成严重影响.其实有时候,仅用这些颜色的一小部分,就足以达到同样效果. 这种情况下,常用的一种方法是 颜色空间缩减 . 其做法是:将现有颜色空间值除以某个输入值,以获得较少的颜色数.例如,颜色值0到9可取为新值0,10到19可取为10,以此类推. uchar (无符号字符,即0

]sap透明表、结构、簇介绍以及查找表方法

一些人在写开发功能说明书的时候不知道如何去找屏幕字段对应的透明表,下面我来介绍一个比较有效的方法:首先简单介绍一下概念:在SAP中的表的种类有以下三种:Tranparent table,Pools,Cluster table. 透明表每个透明表在数据库中有一个相应的物理表.物理表的名称和数据字典中的逻辑表定义的名称一致.事物中处理的数据存贮在透明表中.可以通过数据库直接查询,abap人员也希望能了解这个表的名字. 存贮表存储表可以用来存贮控制数据(例如:屏幕顺序,程序参数或临时数据).几个存储表

表单的属性和方法, 获取表单和表单的元素, 验证表单

表单的属性和方法 一. 表单字段的属性(id/name/value/form),这里用value属性来举例 上面的form属性代表获取表单字段的父级表单对象 1. 属性的获取         console.log(document.myform.username.value); 2. 属性的设置            document.myform.username.value="123"; 3. 获取表单字段的父级表单对象 console.log(document.myform.u

[ jquery 过滤器 parentsUntil([expr|element][,filter]) ] 此方法用于在选择器的基础之上搜索查找当前元素的所有的父辈元素,直到遇到与表达式和限定条件相匹配的那个元素为止

查找当前元素的所有的父辈元素,直到遇到匹配的那个元素为止 如果提供的jQuery代表了一组DOM元素,.parentsUntil()方法也能让我们找遍所有元素的祖先元素,直到遇到了一个跟提供的参数匹配的元素的时候才会停下来.这个返回的jQuery对象里包含了下面所有找到的父辈元素,但不包括那个选择器匹配到的元素 [expr][,filter] expr: 用于筛选祖先元素的表达式 filter: 一个字符串,其中包含一个选择表达式匹配元素 [element][,filter] element:用