Вы (в заблуждение) назвали своего сеттера instance_variable
.Это не переменная экземпляра, это метод, который устанавливает переменную экземпляра.
Когда вы вызываете self.instance_variable=
, вы вызываете этот метод.Когда вы устанавливаете @instance_variable
напрямую, вы устанавливаете саму переменную, и поэтому метод установки не вызывается.
Более идиоматическое соглашение об именах будет выглядеть примерно так:Конечно, для простых методов получения и установки сквозного типа вы можете использовать
attr_reader :name #generates getter only
attr_writer :name #generates setter only, not very common
attr_accessor :name #generates getter and setter
Вышеуказанные методы являются синтаксическим сахаром, который генерирует для вас методы get и / или set.Позже они могут быть переопределены, чтобы обеспечить дополнительную функциональность при необходимости.
РЕДАКТИРОВАТЬ: я вижу, что вы сделали обновление и просто хотели указать, что этот метод вообще не устанавливает переменную экземпляра:
def instance_variable=(var)
puts "inside getter"
instance_variable = var
end
В этом случае instance_variable
является просто локальной переменной и будет отброшено, как только метод выйдет.Локальные переменные имеют приоритет над методами экземпляра, а переменные экземпляра всегда начинаются с символа @
.