Sprite = {x = 0, y = 0, pos = {z=0}}
function Sprite:new()
o = {}
setmetatable(o,self)
self.__index = self
return o
end
s1 = Sprite:new()
s2 = Sprite:new()
s1.x = 10
s1.pos.z = 5
print("s1.x", s1.x, "s2.x", s2.x, "s1.z",s1.pos.z, "s2.z", s2.pos.z)
s2.x = 20
s2.pos.z = 50
print("s1.x", s1.x, "s2.x", s2.x, "s1.z",s1.pos.z, "s2.z", s2.pos.z)
表屬性在上面的代碼段中,我定義一個類Sprite
具有x(int),y(int),pos(table)
3個屬性,但是當我的init 2個對象s1,s2
。我發現他們共享了pos
屬性。不能繼承父
如果您運行的代碼,它會打印:
s1.x 10 s2.x 0 s1.z 5 s2.z 5
s1.x 10 s2.x 20 s1.z 50 s2.z 50
s1
和s2
都有自己x,y
屬性,但共享pos
屬性,如果s1.pos.z
發生變化,所以作爲s2.pos.z
。
我該如何解決這個問題?
'self .__ index = self'應該在'Sprite:new'之外完成。 – lhf
但是,如果您從類中複製所有數據,「__index」的用途是什麼?它永遠不會被調用。 – lhf
@lhf我只複製字段值(instanceData)。沒有必要複製方法,所以metatable對他們更好。這將是更清晰的解決方案,創建類表,但它是一個簡單的例子。也許我會在稍後提供。 – Seagull