在实例化对象时获取对象的引用

时间:2017-06-05 22:14:21

标签: ruby

我想在实例化它时引用一个对象,以便将它传递给我正在实例化的另一个对象。我的意思是:

A.new(B.new(self))

在这种情况下,self将引用我实际调用A.new的范围。我想要的是self(或其他任何关键字)来引用新实例化的A对象,以便B可以引用A。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

由于循环引用,您编写它的方式(A.new(B.new(self))不可能

要创建A的实例,您需要一个B的实例;为了创建B的实例,您需要A的实例。

有几种方法可以调整实现以实现此目的,但您必须首先解决AB之间的鸡与蛋问题。例如:

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)