2011-12-15 73 views
2

我需要從另一個模塊類中訪問配置變量。如何通過同一模塊的類訪問類實例變量?

在test.rb中,如何從client.rb獲取配置值? @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

如果要從類外部訪問實例屬性,則需要提供一個訪問器。 – 2011-12-15 23:02:02

回答

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 2011-12-22 04:16:46