【问题标题】:Table of Objects in LuaLua 中的对象表
【发布时间】:2021-11-18 09:17:35
【问题描述】:

我正在尝试创建这样的 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

如何让这些对象在表中保留它们自己的实例?

【问题讨论】:

  • Block:new函数体内self是一个类,block是一个实例。所以,用block.x = x替换self.x = x

标签: object oop lua instance


【解决方案1】:

在你的代码中

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 的每次调用都对同一个全局变量进行操作。所以每次调用它都会覆盖上一次调用的结果。

第二个问题是你没有修改你的实例,而是修改了类本身。由于您的实例没有 xycolor,因此由于 __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')

因此,您尝试创建一个名为 blockBlock 类的实例。如果您想更改该实例属性,则必须使用 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

【讨论】:

    【解决方案2】:

    您应该在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-08
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多