Lua表的本质:
Lua的表本质其实是个类似HashMap,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制来模拟了类似“类”的行为。
元表与_index:
如果A的元表是B,那么如果访问了一个A中不存在的成员,就会访问查找B中有没有这个成员。这个过程大体是这样,但却不完全是这样,实际上,即使将A的元表设置为B,而且B中也确实有这个成员,返回结果仍然会是nil,原因就是B的__index元方法没有赋值。
举例:
在上述例子中,访问son.house时,son中没有house这个成员,但Lua接着发现son有元表father,此时,Lua并不是直接在father中找名为house的成员,而是调用father的__index方法,如果__index方法为nil,则返回nil,如果是一个表那么就到__index方法所指的这个表中查找名为house的成员,于是,最终找到了house成员。