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 本身。由于您的实例没有 xycolor,由于 __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')

因此您尝试创建一个名为 blockBlock 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