Lua 元表(Metatable) __newindex之 二

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

猜你喜欢

转载自blog.csdn.net/LIQIANGEASTSUN/article/details/127472649