lua 元表理解 __index __newindex

lua 表的本质是一个HasMap的东西,是一个Key-Value的形式,除了nil,其他的任何值都能做key,在一个lua表中去查找一个不存在的key的时候,就会触发lua自己的一套查找机制,同样的继承也是根据这个机制实现的。

 

1.什么是元表:

        我认为是一个备用操作指南,这个指南里面有很多方法,__index,__newindex,add,sub, 

__index 这个方法表示:如果查找字段失败,请来找我,按照我的操作走

__newindex这个方法表示:给字段更新赋值失败,请来找我,按照我的操作走,其他指南类似。

这里有一个误区,当A有一个元表B,在A中没有找到字段,就在B中查找,这并不正确。

事实上是:A有一个元表B,这只是有了这个指南,如果你在A中找到了,就跟指南没有任何关系,

如果你没有找到,这就需要元表了。嘿嘿,我现在查找失败了,怎么办,指南说你找__index方法,它知道

这个时候__index就说,按照我的操作走。

2.查找机制:(查找字段。1.首先在当前表中查找,如果有则返回,如果没有,

2.继续查找是否存在元表,如果没有,返回nil,如果有,

3.继续查找元表的__index方法的索引,如果没有,返回nil,如果有

4.继续查找__index方法所对应的值(__index方法的值可以是一个表__index={tab},

也可以是一个方法__index=function() return 10 end),如果__index对应的值是一个表,则重复查找,否则nil

大概机制是这样的,还是看例子来的快

例1:

people = {
    woman=1
	man=2
}
child = {
	woman=3
}
setmetatable(child, people)
print(child.man)

打印结果   nil

我们在child中去找man,很明显没有,接着查找元表,有元表是people,接着查找__index方法所对应的值,这里没有设置,所以返回nil

 例2:

people = {
    woman=1
	man=2
}
people.__index = people -- 把people的__index方法指向自己
child = {
	woman=3
}
setmetatable(child, people)
print(child.man)

打印结果   2

我们在child中去找man,很明显没有,接着查找元表,有元表是people,接着查找__index方法所对应的值,这里把__index的值设置为people本身,所以去peopel中查找man字段,有man=2,则返回2

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值