Как мне получить доступ к переменной экземпляра класса через класс того же модуля? - PullRequest
2 голосов
/ 16 декабря 2011

Мне нужно получить доступ к переменным конфигурации из другого класса модуля.

В test.rb как я могу получить значения конфигурации из client.rb? @config дает мне неинициализированный var. Он находится в том же модуле, но в другом классе.

Является ли лучшим вариантом для создания нового экземпляра конфигурации? Если да, то как мне получить аргумент, переданный через 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

1 Ответ

1 голос
/ 16 декабря 2011

@ config - это переменная экземпляра, если вы хотите получить ее извне, вам нужно предоставить метод доступа и присвоить объекту Easy class self.

client.rb:

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

test.rb

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

Если вы используете @@ config, то вы можете получить доступ к этой переменной без предоставления объекта self с помощью class_variable_get.

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

Я рекомендую вам прочитать метапрограммированиерубиновая книга.

...