Lua 元表(Metatable) __newindex之 二
续接上一篇 Lua 元表(Metatable) __newindex之 一
代码
-- 表
animation = {
}
animation.leg = 4
-- 表
bird = {
}
bird.color = "red"
-- 令 __newindex 等于一个函数
animation.__newindex = function()
end
setmetatable(bird, animation)
bird.wing = 2
print("bird.wing:"..tostring(bird.wing))
-- 输出:bird.wing:nil
print("animation.wing:"..tostring(animation.wing))
-- 输出:animation.wing:nil
因为当 bird 添加新索引建时会调用到元方法 __newindex,也就是会调用到匿名函数,匿名函数什么都没有做,所以赋值将无法执行
代码
-- 表
animation = {
}
animation.leg = 4
-- 表
bird = {
}
bird.color = "red"
setmetatable(bird, animation)
-- 当给添加新索引时,会将 表自己、新索引、新值
-- 传递进来
animation.__newindex = function(table, key, value)
print("-----------------------")
for k, v in pairs(table) do
print(k.." "..v)
end
print("-----------------------")
end
bird.wing = 2
-- 输出:
-----------------------
--color red
-----------------------
print()
print("bird.wing:"..tostring(bird.wing))
-- 输出:nil
print("animation.wing:"..tostring(animation.wing))
-- 输出:animation.wing:nil
print()
调用 bird.wing = 2 时,调用到 __newindex 的匿名函数 function(table, key, value)
函数得到的三个参数对应关系:
table:bird,
key:“wing”,
value:2
函数内部对表遍历但是什么都没做,所以 bird.wing 赋值失败
for k, v in pairs(table) do
print(k…" "…v)
end
代码
-- 表
animation = {
}
animation.leg = 4
-- 表
bird = {
}
bird.color = "red"
animation.__newindex = function(table, key, value)
-- rawset 函数给 表赋值新索引
rawset(table, key, value)
print("rawset:"..key.." "..value)
end
setmetatable(bird, animation)
bird.wing = 2
print("bird.wing:"..tostring(bird.wing))
-- 输出:bird.wing:2
print("animation.wing:"..tostring(animation.wing))
-- 输出:animation.wing:nil
调用 bird.wing = 2 时,通过 __newindex 调用到函数 function(table, key, value)
在函数中调用到 rawset(table, key, value)
实际参数为 rawset(bird, "wing ", 2) 最终将新索引键 wing 赋值给 bird