我想在實例化對象時將對象傳遞給另一個對象,我正在實例化它。我的意思是什麼:在實例化對象時獲取對象的引用
A.new(B.new(self))
在這種情況下,self
要提到在我實際調用A.new
範圍。我想要的是self
(或任何其他關鍵字)來引用新實例化的A
對象,因此B
將引用A
。有沒有辦法做到這一點?
我想在實例化對象時將對象傳遞給另一個對象,我正在實例化它。我的意思是什麼:在實例化對象時獲取對象的引用
A.new(B.new(self))
在這種情況下,self
要提到在我實際調用A.new
範圍。我想要的是self
(或任何其他關鍵字)來引用新實例化的A
對象,因此B
將引用A
。有沒有辦法做到這一點?
您已寫入它(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
實例被創建第一。但是這一次,我已經完成了所有的初始化工作,而不是在new()
methed調用中進行初始化。
最後一個例子:
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
。這可以很容易地已經寫在兩行代碼,用常規的變量,而不是封閉:
a = A.new
a.b = B.new(a)
感謝湯姆。我意識到我發佈後不久就遇到了設計問題。我解決了它這樣的: 'A.new(B)' 然後內'A',我初始化'B'像我想。 –
要這樣調用它會是一個循環引用,因爲需要在A實例實例B,這是A需要的,等等。你可以將B.new移動到A#初始化中。 –
如果你在這一點上,可能會有更好的設計,你沒有看到。用一些示例代碼嘗試充實你的例子。 – Rogue
'B.new(A.new)',不夠嗎? – progfan