2011-12-20 8 views
0

インスタンス変数がクラスBar1、Bar2、Bar3であるクラスがあるとします。 Barクラスの定義は任意であり、例のために名前がちょうど同じです。 BAR1、BAR2、BAR3は、私はちょうどデモのために所有者の値を構成したオブジェクトをそのパラメータの1つで参照する

class Bar1 
    def initialize 
    @value = owner.test_value # 'owner' would refer the Foo instance that contains this Bar1 
    end 
end 

class Bar2 
    def initialize 
    @value = owner.test_value 
    end 
end 

class Bar3 
    def initialize 
    @value = owner.test_value 
    end 
end 

のように定義されている

class Foo 
    attr_reader :test_value 

    def initialize 
    @test_value = "awesome" 
    @bar1 = Bar1.new 
    @bar2 = Bar2.new 
    @bar3 = Bar3.new 
    end 
end 

、でも可能、このようなものでしょうか?これは一種のように思えますが、この機能を必要とするコードを再構成するだけで解決できますが、完全に放棄する前にそれが可能かどうかを確認したいと考えています。

ありがとうございます!

答えて

1
class Foo 
    attr_reader :test_value 

    def initialize 
    @test_value = "awesome" 
    @bar1 = Bar1.new(self) 
    @bar2 = Bar2.new(self) 
    @bar3 = Bar3.new(self) 
    end 
end 

class Bar1 
    def initialize owner 
    @value = owner.test_value 
    end 
end 

class Bar2 
    def initialize owner 
    @value = owner.test_value 
    end 
end 

class Bar3 
    def initialize owner 
    @value = owner.test_value 
    end 
end 
+0

それはあなたが本当に望んだ場合にもちょうどオーナーへの参照を保持できます。 'initialize'に' @owner = owner'という行を追加するだけです。 Rubyオブジェクトがどの他のオブジェクトへの参照を保持できるかについての規則はありません。オブジェクトが木のようなものではない、というようなものです。 –

+0

これはちょうどうまくいく、私はプログラミングの長い一日の後にこれをやってみることに失敗した、ありがとう! –

0

オブジェクトは、1000個の異なる変数に一度に割り当てることができるため、その「所有者」が何であるかを知ることができません。あなたがオブジェクトを作成するときに明示的に例えば、インスタンス変数を設定している場合のみ、近似である:

def Foo 
    attr_reader :test_value, :bar1 

    def initialize 
    @test_value = 'awesome' 

    @bar1 = Bar1.new 
    @bar1.owner = self # you could also make Bar1#new take an argument which 
    end     # would be assigned to @owner 
end 

def Bar1 
    attr_accessor :owner 

    def initialize 
    # ... 
    end 

    def value 
    owner.test_value 
    end 
end 

f = Foo.new 
f.bar1.value # => 'awesome' 
+0

上記の答えと同じ概念ですが、入力に感謝します。 –

関連する問題