2012-01-17 13 views
3

は、私は1つのプロジェクトを開発する奇妙な困難に会いました。私はクラスで十分な経験を持っていないので、これが私がここで尋ねる理由です。 1つのパラメータで初期化されたクラスが1つあり、そのクラス関数を呼び出すために他のクラスが必要ですが、そのクラスが初期化されるまでは私は傾けることができません。ここでRubyの間、クラスの通信

は、私が話して何のいくつかの例です:

class AVR 
    def initialize(device) 
     @device = device 
     @avr_conf = YAML::load(File.open("./devices/#{device}.yaml")) 
    end 

    def avr_conf 
     return @avr_conf 
    end 
end 

class IO 
    def setMode(a,b) 
     "#{AVR.avr_conf[a]} = #{b}" 
    end 
end 
+0

ここで簡単な方法はないように思えます。 'AVR'は' device'を初期化する必要があり、 'setMode'メソッドにはデバイスがありません。 'IO'クラスの完全なコードを表示しませんか? –

+0

@SergioTulentsevそれだけだという考えが、私は何も見つからないアンロードされたクラスはないだろうので、また初期化されるだろう、すべてのサブクラスを初期化した後に何らかの形でマスタークラスを作りたいですか? –

+0

クラス全体が表示されていないような気がします。上記のコードは実行されませんでしたか? 'class IO'の' setMode'がAVRでシングルトンメソッドを実行しようとしています...正しいのですか? AVRにはもっと多くのものが必要です....「def self.avr_conf」はどこかにあるはずですか? – slindsey3000

答えて

2

あなたは次のいずれかのインスタンスを必要とする、またはavr_confクラスメソッドを作る(とは異なる初期化)します。インスタンスと

:コンフィグシングルトン(およそ)で

avr = AVR.new(a_device) 
avr.avr_conf[a] 

class AVR 
    def self.class_initialize(device) 
    @@avr_conf ... etc ... 
    end 

    def self.avr_conf 
    return @@avr_conf 
    end 
end 

その後クラスIOが更新されたバージョンを使用する必要があるでしょうが、しかしそれが適切なのです。

IOがインスタンスを取得していない場合、/ singleton-configのクラスとなりますが、このアプローチでは少し神経質になります。実際classinstance方法 -

0

あなたは独立したクラスがまだ初期化されていない場合、依存の方法は、単に例外をスローかもしれない:

class IO 
    def setMode(a, b) 
    raise StandardError.new("AVR device is not initialized") unless AVR.avr_conf 
    AVR.avr_conf[a] = b 
    end 
end 

注しかし、このことIO拡張メソッドはどのインスタンスを変更すべきかを知る必要があるため、AVRクラスはシングルトン(またはモジュール)である必要があります。

+0

この場合、 'avr_conf'はクラスメソッドではなくインスタンスメソッドですので、それほど単純ではありません。この例は多少混乱しているようです。 – tadman

+0

@tadman:はい。したがって、インスタンスについての更新(まだロードしていない可能性があります)。 – maerics

+0

ああ、私は今参照してください。それはそれを説明する。 – tadman

0

は、Rubyのクラスのメソッドの2種類があります。 クラスメソッドself.接頭辞で定義し、クラスを初期化する必要はありません。

だから、
class AVR 
    def self.avr_conf 
    'something here' 
    end 
end 

、この場合には、あなたが呼び出す必要があります:AVR.avr_conf'something here'結果を取得します。

しかし、あなたの場合には、@avr_conf変数がinitialize方法で定義し、あなたが持つクラスのインスタンスを作成する必要があります。

avr = AVR.new('something') 
avr.avr_conf[a] = b