1.__index则用来对表访问
在表中查找,如果找到,返回该元素,找不到判断该表是否有元表,如果没有元表,返回 nil,有元表则判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复上面的流程;如果 __index 方法是一个函数,则返回该函数的返回值.
curtable = setmetatable({key1 = "value1"}, {
__index = function(table, key)
if key == "key2" then
return "metatablevalue"
else
return nil
end
end
})
print(curtable.key1,curtable.key2)
输出:value1 metatablevalue
curtable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
print(curtable.key1,curtable.key2)
输出:value1 metatablevalue
2.__newindex 元方法用来对表更新
当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
curtable = setmetatable({key1 = "value1"}, {
__newindex = function(table, key, value)
print(key, value)
rawset(table, key, value)
end
})
curtable.key1 = "new value"
curtable.key2 = 4
print(curtable.key1,curtable.key2)
输出:
key2 4
new value 4