あなたはそれを書かれている方法(A.new(B.new(self))
)循環参照による、不可能です。
A
のインスタンスを作成するには、B
のインスタンスが必要です。 B
のインスタンスを作成するには、A
のインスタンスが必要です。
これを可能にするために実装を調整する方法はいくつかありますが、最初にA
とB
の間のこの鶏と卵の問題を解決する必要があります。例えば:上記のコードでは、a
は最初に初期化されていること
class A
def initialize
@b = yield(self)
end
end
class B
def initialize(a)
@a = a
end
end
A.new { |a| B.new(a) }
注意。オブジェクトが作成された後にはの範囲内でのみ返されます。
それとも、ここで別の方法があります:上記のよう
class A
def initialize
@b = B.new(self)
end
end
class B
def initialize(a)
@a = a
end
end
A.new
、A
のインスタンスが最初を作成されています。しかし、今回は、new()
メッシュコール内に構築するのではなく、すべての初期化を1回で済ませました。
最後にもう一つの例:この例では
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) }
、私はが完全にb
のその属性を定義する前にa
を初期化しています。これは同じように簡単に代わりクロージャの正規変数と、2行のコードで書かれている可能性:
a = A.new
a.b = B.new(a)
インスタンスがBをインスタンス化するために必要とされるので、この方法は、円形の基準となり、それを呼び出すために、これはAなどに必要です。B.newをA#に初期化することもできます。 –
この時点では、あなたが見ていないより優れたデザインがおそらくあります。いくつかのサンプルコードであなたのサンプルをもう少し詳しく調べてみてください。 – Rogue
'B.new(A.new)'は不十分でしょうか? – progfan