2011-12-15 71 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