2

私の腸は私が明らかな間違いを犯していると私に言います、しかしそれは私を逃れています。次のサンプルコードを使用して、指定された「親」オブジェクトから「子」オブジェクトを作成しようとしています。

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

つまり、nil値であるInitializeメソッドを呼び出そうとして失敗するのは逐語的です。この編集の前に私のサンプルコードが機能したとすると、テーブルAdがどのように定義されているかが問題になりますか?または、ここのどこかに構文エラーがありますか?

  • コードスニピットを失敗した実際のコードに置き換えるように編集
4

1 に答える 1

4

問題はこれです:

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

に割り当てられる前にテーブルが完全に構築されるため、その時点__indexで、Adは、に割り当てられます。が設定されていないため、の検索は失敗します。nilAd__indexInitialize

代わりに、次のようにします。

local Ad = {
    ...
}
Ad.__index = Ad
于 2013-03-02T01:12:51.463 に答える