0

以下は、私が問題を抱えているシステムの要点です。私はself、.、および:.を理解しているようです。何かが足りないようです。何が起こっているかというと、「Object:setSomeObjectIsAttachedTo()」を呼び出すと、単純に「self」を印刷すると、テーブルアドレスが印刷されます。さらに一歩進んで「self.someObject」を印刷しようとすると、オブジェクトには「Object.new(args)」で最初に作成されたキーsomeObjectがあるため、nilが発生するはずはありません。さらに一歩進んでみましたが、nil 以来、そこに行くことさえできませんでした。助けてください!!

オブジェクトファイル

Object = {};

ObjectMeta = {__index = Object};

function Object.new(args)
    Obj = {};
    Object.someObject = OtherObject.new(args)
    return setmetatable(Obj,ObjectMeta );
end

function Object:setSomeObjectIsAttachedTo()
    --OtherObject instance Should set its attached property to 
    --This instance of Object
    self.someObject.ObjectImAttachedTo = self;
end

--Calls after new to set the ObjectImAttachedTo Property, So it isnt nil
Object:setSomeObjectIsAttachedTo();

return Object;

その他のオブジェクト ファイル

OtherObject = {};

OtherObjectMeta = {__index = OtherObject};

function OtherObject.new(args)
    Obj = {};
    Obj.ObjectImAttachedTo =nil;
    return setmetatable(Obj,ObjectMeta );
end
return Object;

アップデート

シーン

Scene = {};

ObjectContainer = {};

function Scene.new()

end

function Scene.addObjects()
    local Object= require "Object"
    local StartX = 50;
    local StartY = 20;
    local counter = 0;
    for i=0, 17 do
         ObjectContainer[i] = Object.new({x=StartX,y=StartY});
    end
end

Scene.addObjects();
return Scene
end
4

1 に答える 1

1

テーブルObjectには という名前のフィールドはありませんが、someObjectによって返されるインスタンスにObject.new()はそのフィールドがあります。これらは 2 つの異なるテーブルで、クラスとそのインスタンスの 1 つに大まかに対応しています。

補遺

改訂されたコードでは、を呼び出すまでObjectフィールドがありません。したがって、 を呼び出す前に呼び出す必要があります。を呼び出す前に を定義する必要があることに注意してください。someObjectObject.new()Object.new()Object:setSomeObjectIsAttachedTo();OtherObject.new()Object.new()

ADDENDUM2 「これを修正するために何を提案しますか?」という質問への回答

function Object.new(args)
    Obj = {};
    Obj.someObject = OtherObject.new(args)
    Obj.someObject.ObjectImAttachedTo = Obj;
    return setmetatable(Obj,ObjectMeta );
end

そして取り除くObject:setSomeObjectIsAttachedTo();

于 2013-05-09T02:48:53.803 に答える