设置属性时出现的问题

以下是我遇到问题的系统要点。 我似乎理解了self、.和:。只是似乎漏掉了什么。 发生的情况是当它调用“Object:setSomeObjectIsAttachedTo()”时,如果我只是打印“self”,那么我将获得一个表地址打印。 如果我进一步尝试打印“self.someObject”,我会得到nil,这不应该发生,因为在Object中,它有一个在“Object.new(args)”中创建的someObject键。当然,如果试图进一步进行操作,它甚至无法进入那里,因为它是nil。请帮忙!

Object 文件

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 文件

OtherObject = {};

OtherObjectMeta = {__index = OtherObject};

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

更新

Scene

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
点赞
用户33252
用户33252

表格 Object 中没有名为 someObject 的字段,尽管由 Object.new() 返回的实例具有该字段。这是两个不同的表,大致对应一个类和它的一个实例。

附录

在修订后的代码中,在调用 Object.new() 之前,Object 没有 someObject 字段。因此,在调用 Object:setSomeObjectIsAttachedTo(); 之前,必须调用 Object.new()。请注意,在调用 Object.new() 之前必须定义 OtherObject.new()

附录2 回答问题“所以你建议我如何修复这个问题?”

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

并删除 Object:setSomeObjectIsAttachedTo();

2013-05-09 02:48:53