Что я не могу получить доступ к переменной класса из объекта в ruby? - PullRequest
1 голос
/ 26 августа 2011

Я не хочу устанавливать переменную класса извне (через attr_accessor), а затем обращаться к ней из одного из своих объектов.Я использую ruby ​​1.9.2.Это мой код:

class Service
  def initialize(id)
    @my_id = id   
  end

  class << self
    attr_accessor :shared_id
  end

  def system_id
    @my_id + @@shared_id
  end
end

Если я установлю Service.shared_id = "A2", а затем вызову Service.new("A").system_id, это не вернет "AA2".Он отображает следующую ошибку:

неинициализированная переменная класса @@ shared_id в Service

Поведение такое же, как если бы я не установил Service.service_id.Может кто-нибудь объяснить, почему это происходит?

Ответы [ 3 ]

5 голосов
/ 26 августа 2011

attr_accessor создает методы для управления переменными экземпляра - он не создает переменных экземпляра или класса.Чтобы создать переменную класса, вы должны установить для нее что-то:

@@shared_id = something

Нет вспомогательного метода для создания метода доступа для переменных класса, поэтому вы должны написать их самостоятельно.переменные из-за их странных правил поиска редко используются - даже избегаются.Вместо этого используются переменные экземпляра на уровне класса.

class Service
  @shared_id = thing

  class << self
    attr_accessor :shared_id
  end

  def system_id
     # use self.class.shared_id; you could add a shared_id helper to generate it, too.
  end
end
4 голосов
/ 26 августа 2011

Как насчет cattr_accessor?

0 голосов
/ 26 августа 2011

Помните, что @@class_var является глобальным для всех классов.

...