Lua和对象产卵

时间:2013-03-01 22:17:09

标签: oop lua

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

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是一个零值,这是逐字的。鉴于在此编辑之前我的示例代码确实有效,是否已定义表格广告的问题?或者我在这里有语法错误?

  • 已编辑,将代码snippit替换为失败的实际代码

1 个答案:

答案 0 :(得分:3)

问题在于:

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

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

相反,做一些事情:

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