Доступ к переменной, созданной с помощью attr_accessor

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я пытаюсь понять, к чему attr_accessor дает мне доступ. Насколько я понимаю, он предоставляет методы получения и установки. Итак, attr_accessor :color это создаст для меня что-то вроде следующего

 def color
  @color
end

def color=(value)
  @color = value
end
  

Чего я не понимаю, так это почему в следующем коде, почему я не могу использовать color= в моем инициализаторе? (в конечном итоге она остается пустой). Почему мне нужно использовать @color= or self.color= вместо этого? Разве color= не должен быть способ вызвать метод setter, который был только что создан для меня выше?

 class Bird
  attr_accessor :color
  def initialize(c="green")
    color = c  # this doesn't work
    # either one of the following DOES work
    # @color = c
    # self.color = c
  end
end

puts Bird.new.color  # prints nothing unless using @color or self.color
  

Ответ №1:

Выражение like color = "green" присваивает "green" локальной переменной, не атрибуту. Установщикам атрибутов всегда нужен получатель, даже если получатель есть self .

Комментарии:

1. связанный с этим вопрос, это self.color правильный путь или @color ?

2. @Dty, очень хороший вопрос. Я бы сказал, что в самой реализации класса использование @color нормально. Однако во включенных модулях и любых дочерних классах я бы не советовал использовать @color напрямую (вместо этого используя color or self.color , и self.color= ). Использование переменных экземпляра в производных классах или включенных модулях нарушает инкапсуляцию, хотя Ruby с радостью вам это позволит.

3. Недавно я узнал кое-что, что вам следует использовать self.color , если у вас есть метод setter, который вы хотите запустить. Использование @self.color позволило бы обойти метод setter.