2011-12-15 18 views
2

モジュールの別のクラスの中から設定変数にアクセスする必要があります。同じモジュールのクラス間でクラスインスタンス変数にアクセスするにはどうすればよいですか?

test.rbでは、client.rbからどのように設定値を取得できますか? @configは私に初期化されていないvarを与えます。それは同じモジュールですが、別のクラスにあります。

configの新しいインスタンスを作成することをお勧めしますか?もしそうなら、run.rbを通して渡された引数をどのように取得するのですか?

または、これをすべて間違って構成しているか、attr_accessorを使用していますか?

client.rb

module Cli 
    class Client 

    def initialize(config_file) 
     @config_file = config_file 
     @debug = false 
    end 

    def config 
     @config ||= Config.new(@config_file) 
    end 

    def startitup 
     Cli::Easy.test 
    end 
end 
end 

config.rb

module Cli 
    class Config 
    def initialize(config_path) 
     @config_path = config_path 
     @config = {} 
     load 
    end 

    def load 
     begin 
     @config = YAML.load_file(@config_path) 
     rescue 
     nil 
     end 
    end 
    end 
end 

test.rb

module Cli 
    class Easy 
    def self.test 
     puts @config 
    end 
    end 
end 

run.rb

client = Cli::Client.new("path/to/my/config.yaml") 
client.startitup 
+0

クラス外からインスタンス属性にアクセスする場合は、アクセサーを提供する必要があります。 –

答えて

1

@configはインスタンス変数です。外部から取得したい場合はアクセサーを提供し、Easyクラスの自己オブジェクトに渡す必要があります。

client.rb:

attr_reader :config 
#... 
def startitup 
    Cli::Easy.test(self) 
end 

test.rb

def self.test(klass) 
    puts klass.config 
end 

あなたは@@設定を使用する場合は、あなたがclass_variable_getで、自己のオブジェクトを与えることなく、この変数にアクセスもできます。

class Lol 
    @@lold = 0 
    def initialize(a) 
    @@lold = a 
    end 
end 
x = Lol.new(4) 
puts Lol.class_variable_get("@@lold") 

メタプログラミングルビーの本を読むことをお勧めします。

+0

これはありがとう、これは、ちょうど設定を戻すための答えに私を導いた、ちょっと、モジュール内のクラスへのすべての呼び出しに渡す必要があります。 – pablo