2017-06-05 47 views
0

我想在實例化對象時將對象傳遞給另一個對象,我正在實例化它。我的意思是什麼:在實例化對象時獲取對象的引用

A.new(B.new(self)) 

在這種情況下,self要提到在我實際調用A.new範圍。我想要的是self(或任何其他關鍵字)來引用新實例化的A對象,因此B將引用A。有沒有辦法做到這一點?

+1

要這樣調用它會是一個循環引用,因爲需要在A實例實例B,這是A需要的,等等。你可以將B.new移動到A#初始化中。 –

+0

如果你在這一點上,可能會有更好的設計,你沒有看到。用一些示例代碼嘗試充實你的例子。 – Rogue

+0

'B.new(A.new)',不夠嗎? – progfan

回答

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實例被創建第一。但是這一次,我已經完成了所有的初始化工作,而不是在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) 
+0

感謝湯姆。我意識到我發佈後不久就遇到了設計問題。我解決了它這樣的: 'A.new(B)' 然後內'A',我初始化'B'像我想。 –

相關問題