【问题标题】:Lua and object spawningLua 和对象生成
【发布时间】:2013-02-16 13:10:54
【问题描述】:

我的直觉告诉我,我犯了一个明显的错误,但它正在逃避我。我正在尝试使用以下示例代码从指定的“父”对象创建“子”对象。

local Ad = {
    __index = Ad,
    __tostring = function(self) return self.msg end,
    __concat = function(a, b) return tostring(a)..tostring(b) end,
    Initialize = function(self, msg, wgt)
        if msg and msg ~= "" then
            wgt = wgt or 1
            self.msg, self.wgt, self.ranLog = msg, wgt, {}
        end
    end,
    Increase = function(self)
        if self.wgt < 9 then self.wgt = self.wgt + 1 end
    end,
    Decrease = function(self)
        if self.wgt > 1 then self.wgt = self.wgt - 1 end
    end
}

local function new(src, ...)
    local o = setmetatable({}, src)
    if src.Initialize then o:Initialize(...) end
    return o
end

local ad = new(Ad, "Test Message")
print("Object - "..ad)
for k, v in pairs(ad) do print("", k, v) end
ad:Increase()
print("Modified Object - "..ad)
for k, v in pairs(ad) do print("", k, v) end

所以这就是尝试调用方法 Initialize 失败的原因,该方法是一个 nil 值。鉴于在此编辑之前我的示例代码确实有效,是否与表 Ad 的定义方式有关?还是我这里的某个地方有语法错误?

  • 已编辑以将代码片段替换为失败的实际代码

【问题讨论】:

  • 当我用真实代码替换你的 cmets 时,这对我有用。我认为你的代码过于简化了。
  • 好的,这里(除了我作为示例留下的变量名)我的更多表格,以防这是问题所在。

标签: oop lua


【解决方案1】:

问题是这样的:

local Ad = {
    __index = Ad,
    ...
}

在分配__index 的时候,Adnil,因为在分配给Ad 之前,表是完整构造的。由于未设置 __index,因此查找 Initialize 失败。

相反,请执行以下操作:

local Ad = {
    ...
}
Ad.__index = Ad

【讨论】:

  • 除非我弄错了,Ad 不在该表构造函数的范围内,所以当您执行_index = Ad 时,它实际上使用了全局变量Ad。这也默认为 nil,因此它的工作原理相同,但这意味着您可以通过更改全局环境的元表(严格模式)或使用 linter 来捕捉这些错误。
  • 是的,没错。 Ad 将导致访问_G.Ad,即nil。这是一个很好的观点。如果存在全局Ad,那么它将被分配给__index,这是更出乎意料的行为。在元表中玩游戏时应始终小心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2012-11-30
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多