Table 个对象在 Lua 中
Table of Objects in Lua
我正在尝试创建这样的 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
然后将此对象的几个实例放入单独文件中的table
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
如何让这些对象在 table 中保留它们自己的实例?
您应该在 block
而不是 self
上设置 x,y,color
function Block:new (x, y, color)
block = {}
setmetatable(block, {__index = self})
block.x = x
block.y = y
block.color = color
return block
end
在你的代码中
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
的每次调用都对同一个全局变量进行操作。所以每次调用它都会覆盖上一次调用的结果。
第二个问题是您没有修改您的实例,而是 class 本身。由于您的实例没有 x
、y
和 color
,由于 __index 指的是 Block
,您会退回到 Block 的值
self 指的是 table 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
class 实例。如果您想更改该实例属性,您必须使用 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
我正在尝试创建这样的 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
然后将此对象的几个实例放入单独文件中的table
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
如何让这些对象在 table 中保留它们自己的实例?
您应该在 block
而不是 self
function Block:new (x, y, color)
block = {}
setmetatable(block, {__index = self})
block.x = x
block.y = y
block.color = color
return block
end
在你的代码中
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
的每次调用都对同一个全局变量进行操作。所以每次调用它都会覆盖上一次调用的结果。
第二个问题是您没有修改您的实例,而是 class 本身。由于您的实例没有 x
、y
和 color
,由于 __index 指的是 Block
self 指的是 table 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
class 实例。如果您想更改该实例属性,您必须使用 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