#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
orself.color
, иself.color=
). Использование переменных экземпляра в производных классах или включенных модулях нарушает инкапсуляцию, хотя Ruby с радостью вам это позволит.3. Недавно я узнал кое-что, что вам следует использовать
self.color
, если у вас есть метод setter, который вы хотите запустить. Использование@self.color
позволило бы обойти метод setter.