инициализация класса с помощью config (yaml) и установка переменной, которая должна быть одним экземпляром - PullRequest
0 голосов
/ 13 марта 2012

Я запутался в том, как правильно устанавливать переменные в инициализаторе, я хочу, чтобы они были переменными уровня класса, а не экземпляром.

И я также хочу затем создать отдельный экземпляр другого объекта (это объект соединения, в который уже встроен пул соединений, поэтому мне просто нужна единственная ссылка на него).

Мой инициализатор /initializers/my_class.rb

yml = YAML.load_file("#{Rails.root}/config/my_class.yml")

MYMODULE::MyClass.init(yml)

А вот мой my_class.rb:

module MYMODULE
  class MyClass
    def self.init(yml)
      @post_url = yml["defaults"]["post_url"]
    end

    def self.post_url
      @post_url
    end

    # this should be a single instance
    def connection_pool
      # ???
    end
  end
end
  1. Эти переменные уровня класса, как я могу получить к ним доступ как из методов класса, так и из методов экземпляра?

У меня странное поведение, и я не понимаю, как ссылаться на post_url внутри методов класса или методов экземпляра.

Я видел следующие пути, не уверен, что это правильно:

self.class.post_url
MyClass.post_url
@post_url
post_url
self.post_url

1 Ответ

1 голос
/ 13 марта 2012

self.class.post_url или MyClass.post_url будут работать. Разница заключается в том, как они работают для подклассов (в первом случае подклассы будут использовать свою собственную версию этой переменной автоматически, во втором случае они будут использовать переменную в MyClass).

Невозможно напрямую получить доступ к переменным экземпляра класса из экземпляра: вы должны вызвать метод класса, который возвращает (или устанавливает) их. Смотрите также: cattr_accessor.

Тем не менее, если это действительно синглтон, мне кажется немного странным, что вы сконфигурируете его часть в классе, а затем будете ссылаться на эту информацию в (единственном) экземпляре. Разве не было бы больше смысла просто настроить этот материал на экземпляре? Или использовать модуль в качестве одиночного и вообще не создавать экземпляр?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...