【Lua基础系列】__index元方法
大家好,我是Lampard~~
欢迎来到Lua进阶系列的博客
前文再续,书接上一回。今天和大家讲解一下lua中的__index元方法
从c++,java这些高级语言走过来的我们,肯定对类的继承十分熟悉,甚至没了它还十分不习惯。其实lua也是可以实现继承的,这要利用到它的元方法_index:
local parent = {}
parent["a"] = 111
parent.__index = parent // 把parent表的__index字段仍然设置为parent
local child = {}
setmetatable(child, parent) // 把parent表设置为child表的原表
print(child.a)
这时候我就出现了疑惑:既然说把parent设置为child的原表,那child没有的属性就可以在parent中寻找了呀,设置parent.__index是什么东西?
而这个理解是完全错误的,实际上,即使将child的元表设置为parent,而且parent中也确实有这个成员,但是parent的__index元方法没有赋值为本身,返回结果仍然会是nil!!!
实际上拥有了元表等于告诉了Lua:在A表找不到数据时,我们有解决方法;而元表中的__index则是告诉Lua:你从我的__index中找去吧。所以说parent的__index字段设置成本身相当于告诉lua,没有的话就从parent表中查找吧。
元表的__index字段不一定为自身的表,也可以指向其他表效果一样。
元表的__index字段还可以是一个函数,当在表中找不到这个值时,会调用元表中的__index函数,然后拿去返回值(若无返回值则为nil)