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