我正在嘗試創建一個像這樣的 Lua 物件
Block = {x = 0, y = 0, color = "red"}
function Block:new (x, y, color)
block = {}
setmetatable(block, self)
self.__index = self
self.x = x
self.y = y
self.color = color
return block
end
然后將這個物件的幾個實體放入一個單獨檔案中的表中
blocks = {}
table.insert(blocks, Block:new(0, 0, 'red'))
table.insert(blocks, Block:new(2, 0, 'blue'))
table.insert(blocks, Block:new(1, 1, 'green'))
for i,v in ipairs(blocks) do
print(i,v.x, v.y, v.color)
end
但我的輸出是
1 1 1 green
2 1 1 green
3 1 1 green
如何讓這些物件在表中保留它們自己的實體?
uj5u.com熱心網友回復:
在你的代碼中
Block = {x = 0, y = 0, color = "red"}
function Block:new (x, y, color)
block = {}
setmetatable(block, self)
self.__index = self
self.x = x
self.y = y
self.color = color
return block
end
導致所有實體都相同的第一個問題是您沒有block將函式設為本地。相反,每次呼叫都Block.new對同一個全域變數進行操作。因此,每次呼叫它時,都會覆寫上一次呼叫的結果。
第二個問題是你不修改你的實體而是類本身。由于您的實體沒有x,y并且color由于 __index 參考 Block而您退回到 Block 的值
self 指的是表Block,function Block:new(x, y, color)相當于function Block.new(self, x, y, color)你的函式呼叫Block:new(0, 0, 'red')相當于Block.new(Block, 0, 0, 'red')
因此,您嘗試創建Block名為的類的實體block。如果您想更改該實體屬性,您必須使用block.x = x而不是self.x = x因為否則您將更改Block它將反映在所有實體上。
Block = {x = 0, y = 0, color = "red"}
function Block:new (x, y, color)
local block = {}
setmetatable(block, self)
self.__index = self
block.x = x
block.y = y
block.color = color
return block
end
uj5u.com熱心網友回復:
你應該設定 x,y,colorblock而不是self
function Block:new (x, y, color)
block = {}
setmetatable(block, {__index = self})
block.x = x
block.y = y
block.color = color
return block
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361227.html
上一篇:如何更改嵌套物件陣列中的所有鍵名javascript
下一篇:使用VBA決議JSON物件和集合
