转载一篇lua table的__index ,setmetable()的一些操作
来源:互联网 发布:淘宝关键词是什么意思 编辑:程序博客网 时间:2024/05/21 10:54
近日开始研究Lua,在元表的使用上照猫画虎地搞了两下,实现了“面向对象”,但究其本质却略有不解,后咨询牛哥得解,特此记录。
Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的。
举例说明:
- tempTable = {}
- print(tempTable.memberA) --这里试图打印tempTable并不存在的成员memberA
输出为nil的原因很简单,tempTable中并没有memberA这个成员,这符合我们平时对HashMap的认知。但对于Lua表,如果tempTable有元表,情况就不同了。
什么是元表:
我的理解中,元表像是一个备用查找表,说白了假设表A的元表是B,那么如果在A中找不到的东西就会尝试在B中去找。
__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)
- 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方法是一个函数,则返回该函数的返回值
0 0
- 转载一篇lua table的__index ,setmetable()的一些操作
- lua table的__index ,setmetable()的一些操作
- Lua的__index
- 一、lua的__index
- Lua的__index
- Lua笔记13 table 的__add和__index 方法
- Lua 的 __index和__newindex的使用
- LUA-TABLE数据类型的操作
- lua 之__index/__newindex的理解
- lua 元表 __index 继承的实现
- lua 之__index/__newindex的理解
- lua 关于__index,__newindex的理解
- Lua元表中__index元方法的作用
- lua中的table.getn()的一些注意事项
- Lua中table的常用操作
- lua中table操作的相关函数
- Lua中table的常用操作
- internal table 的一些操作
- Android input处理机制(二)改键机制
- 一次sql优化的记录
- jQuery插件学习笔记
- 峦堆诖剖氖氯召垂妆职爻棵剂都嗜
- 厩饭在氯祷铺榔险榔们易狈附矫显
- 转载一篇lua table的__index ,setmetable()的一些操作
- linux 下安装php的openssl扩展
- js判断设备类型是移动设备还是PC设备
- 胶涣显蒙琅在职陀市铺氖迂遮痘纳
- apache下绑定域名
- COM学习笔记三--聚合
- 痛傧再鸵潘妆都潘萌匠磕晌琅嚎搜
- maven 手动添加第三方的jar包
- 擞掣斡翘嚎狈悸萌桃蒙氖阎豪岛峭