我想在实例化它时引用一个对象,以便将它传递给我正在实例化的另一个对象。我的意思是:
A.new(B.new(self))
在这种情况下,self
将引用我实际调用A.new
的范围。我想要的是self
(或其他任何关键字)来引用新实例化的A
对象,以便B
可以引用A
。有没有办法做到这一点?
答案 0 :(得分:2)
由于循环引用,您编写它的方式(A.new(B.new(self))
)不可能。
要创建A
的实例,您需要一个B
的实例;为了创建B
的实例,您需要A
的实例。
有几种方法可以调整实现以实现此目的,但您必须首先解决A
和B
之间的鸡与蛋问题。例如:
class A
def initialize
@b = yield(self)
end
end
class B
def initialize(a)
@a = a
end
end
A.new { |a| B.new(a) }
请注意,在上面的代码中,a
正在初始化首先。只有在创建对象之后范围内才会产生它。
或者,这是另一种方式:
class A
def initialize
@b = B.new(self)
end
end
class B
def initialize(a)
@a = a
end
end
A.new
如上所述,正在创建A
的实例 first 。但是这一次,我已经完成了所有初始化,而不是在new()
方法调用中构建它。
最后一个例子:
class A
attr_writer :b
def initialize
end
end
class B
def initialize(a)
@a = a
end
end
A.new.tap { |a| a.b = B.new(a) }
在此示例中,我在完全初始化 a
之前定义了b
的属性。这可以很容易地用两行代码编写,使用常规变量而不是闭包:
a = A.new
a.b = B.new(a)