如何跨同一模块的类访问类实例变量?

发布于 2024-12-21 20:00:31 字数 1018 浏览 0 评论 0原文

我需要从模块的另一个类内部访问配置变量。

在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

戒ㄋ 2024-12-28 20:00:31

@config是一个实例变量,如果你想从外部获取它,你需要提供访问器,并赋予Easy类自身对象。

client.rb:

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

test.rb

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

如果您使用@@config,那么您可以使用class_variable_get访问此变量,而无需给出self对象。

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

我推荐你阅读 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:

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

test.rb

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

If you use @@config, then you can acces to this variable without giving a self object, with class_variable_get.

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

I recommend to you read metaprogramming ruby book.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文