元表就是一个表
__newindex:给原来表中不存在的key赋值时会转到__newindex。
为一个方法时执行这个方法:
t = {} --元表
t1 = {age = 18}
t.__newindex = function(tab, key)
print("原来的表中没有key:" .. key)
end
setmetatable(t1, t)
t1.name = "小明" --执行方法,不执行赋值操作
print(t1.name)
>原来的表中没有key:name
>nil
为一个表时,会修改或添加__newindex表中key对应的元素
tt = {} --元表
t2 = {}
t3 = {name = "小明"}
tt.__newindex = t3
setmetatable(t2, tt)
t2.name = "XXX" --修改或添加__newindex里对应key元素
print(t2.name)
print(t3.name)
>nil
>XXX
忽略元表rawget和rawset
t = {
__index = function( ... )
print("__index")
end,
__newindex = function()
print("__newindex")
end
} --元表
t1 = {}
setmetatable(t1, t)
i = t1.name --打印 __index
t1.name = "小明" --打印 __newindex,赋值不执行
i = rawget(t1, "name")
print(i) --返回 nil
rawset(t1, "name", "哇哈哈")
i = t1.name
print(i) --打印 哇哈哈
网友评论