(1):元表作为一个表,可以拥有任意类型的键值对,其真正对被设置的表的影响是Lua规定的元方法键值对。
(2):这些键值对就是Lua所规定的键,比如__index,__add,__concat等等。这些键名都是以双下划线__为前缀。其对应的值则为一个函数,被称为元方法(metamethod),
(3):这些元方法定义了你想对表自定义的操作。如:__index键,在Lua中它所对应的元方法执行的时机是当查找不存在于表中的键时应该做的操作
如下:
child仅设置元表father,则father.__index = nil
仅有元表,此时元表的__index为nil,将使得以下输出为 nil 男孩
local father = {}
father.name = "zhangsan"
local child = {}
child.sex = "男孩"
setmetatable(child,father)--仅有元表,此时元表的__index为nil,将使得以下输出为 nil 男孩
print(child.name)
print(child.sex)
为元表的__index赋值,使得father.__index = father,则变成
有元表,__index有值,指向一张表father,将使得child在自己表中找不到name,去__index指向的father中找
local father = {}
father.name = "zhangsan"
local child = {}
child.sex = "男孩"
father.__index = father--为__index赋值
setmetatable(child,father)--有元表,__index有值,指向一张表father,将使得child在自己表中找不到name,去__index指向的father中找
print(child.name)
print(child.sex)
总结:
Lua查找一个表元素的规则可以归纳为如下几个步骤:
Step1:在表自身中查找,如果找到了就返回该元素,如果没找到则执行Step2;
Step2:判断该表是否有元表(操作指南),如果没有元表,则直接返回nil,如果有元表则继续执行Step3;
Step3:判断元表是否设置了有关索引失败的指南(__index元方法),如果没有(__index为nil),则直接返回nil;如果有__index方法是一张表,则重复执行Step1->Step2->Step3;如果__index方法是一个函数,则返回该函数的返回值