【问题标题】:Acces function from constructor in Lua从 Lua 中的构造函数访问函数
【发布时间】:2013-05-07 06:14:18
【问题描述】:

我在 Lua 上有一堂课。在这个构造函数中,我声明了变量(在一个空表中),然后我想访问对象的函数以在这个表中插入对象。我的代码是这样的:

local BoxClass = require("Box")
local SurpriseBox = {}
local SurpriseBox_mt = { __index = SurpriseBox }    -- metatable

function SurpriseBox.new()  -- constructor
  local object = {
    boxes = {}
  }
  SurpriseBox:CreateBoxes()
  print('constructor -> ' .. #object.boxes)  --> 0
  return setmetatable( object, SurpriseBox_mt )
end

-------------------------------------------------

function SurpriseBox:CreateBoxes()
  local box1 = BoxClass.new('palo', 'images/chestClose.gif', 'OPEN')
  local box2 = BoxClass.new('moneda', 'images/chestClose.gif', 'OPEN')

  self.boxes = { box1, box2}
end

访问函数 CreateBoxes() 后,表格内没有任何内容。

感谢您的帮助!

【问题讨论】:

  • 查看我的答案以获得解释。至于您的代码,您正在复制表创建。也就是说,在您的构造函数中创建一个空的boxes 表,并在CreateBoxes 函数中将该表替换为另一个表。所以要么不要在构造函数中创建它,要么只填写CreateBoxes。否则效率低下。
  • 感谢您的帮助,但只有一个问题。如果我在构造函数中创建boxes 表并且我想在CreateBoxes() 函数中插入元素,我可以这样做吗? table.insert(self.boxes, element)
  • 是的,你可以。由于您只插入 2 个元素,因此没有太大区别,但一般来说,如果您要填充数组,最好跟踪变量中的元素数量(例如 index),然后进行简单赋值-self.boxes[index] = element。它更有效,因为table.insert 总是检查数组中的项目数,然后才插入项目。
  • 完美!非常感谢!

标签: android class lua coronasdk


【解决方案1】:

当您调用SurpriseBox:CreateBoxes() 时,self 参数仍然指向SurpriseBox 表,而不是您创建的object 表。你应该这样做:

function SurpriseBox.new()  -- constructor
  local object = setmetatable( {boxes = {}}, SurpriseBox_mt )
  object:CreateBoxes()
  print('constructor -> ' .. #object.boxes)
end

关键是在调用CreateBoxes()之前将metatable分配给object,而不是SurpriseBox

【讨论】:

  • 完美运行,这是我的想法!也谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 2010-10-05
  • 2023-04-02
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多