如何跨同一模块的类访问类实例变量?
我需要从模块的另一个类内部访问配置变量。
在test.rb中,如何从client.rb获取配置值? @config
给了我一个未初始化的变量。它位于同一模块但不同的类中。
创建一个新的配置实例是最好的选择吗?如果是这样,我如何获得通过 run.rb 传递的参数?
或者,我只是构建了错误的结构还是应该使用attr_accessor?
客户端.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
配置.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
测试.rb
module Cli
class Easy
def self.test
puts @config
end
end
end
运行.rb
client = Cli::Client.new("path/to/my/config.yaml")
client.startitup
I need to access the config variables from inside another class of a module.
In test.rb, how can I get the config values from client.rb? @config
gives me an uninitialized var. It's in the same module but a different class.
Is the best bet to create a new instance of config? If so how do I get the argument passed in through run.rb?
Or, am I just structuring this all wrong or should I be using 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
@config是一个实例变量,如果你想从外部获取它,你需要提供访问器,并赋予Easy类自身对象。
client.rb:
test.rb
如果您使用@@config,那么您可以使用class_variable_get访问此变量,而无需给出self对象。
我推荐你阅读 ruby 元编程这本书。
@config is a instance variable, if you want get it from outside you need to provide accessor, and give to Easy class self object.
client.rb:
test.rb
If you use @@config, then you can acces to this variable without giving a self object, with class_variable_get.
I recommend to you read metaprogramming ruby book.