Lua table 的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制——元表,也是凭借这个机制来实现了Lua的类
什么是元表:
给一个table关联元表,当前访问的所访问的键不存在table中时, 会返回元表中的值
local father = {
name = "韩"
}
local son = {
desc = "H"
}
setmetatable(son, {
__index = father ,
__newindex = function(table, key, value)
print(key .. " 字段不存在,禁止赋值!");
end
})
print(son.name)
son.money = 1
--输出
--韩
--money 字段不存在,禁止赋值!
__index元方法:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表(操作指南),如果没有元表,返回nil,有元表则继续
3.判断元表(操作指南)中有没有关于索引失败的指南(即__index方法),如果没有(即__index方法为nil),则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值
__newindex元方法:
1.给表的字段赋值时,会在表中查找该字段,如果找到,赋值成功,结束,否则继续
2.判断该表是否有元表,如果没有元表,会在表中添加新的键值对,结束,否则继续
3.判断元表是否有__newindex元方法,如果有,则执行,结束