Инстансные переменные(или переменные экземпляра) определяются с знака @. Неинициализированные переменные экземпляра имеют значение nil. К переменным экземпляра можно получить доступ из всех методов экземпляра.
class User
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
end
Переменные экземпляра обычно объявляются в конструкторе(методе инициализации). При создании нового экземпляра класса вызывается метод конструктора, который инициализирует переменные экземпляра. Они служат контейнерами для данных, специфичных для экземпляров класса.
class User
def name
@name
end
def name=(new_name)
@name = new_name
end
end
user = User.new
user.name = "Artem Pecherin"
user.name # => "Artem Pecherin"
user.instance_variables # => @name
Объявление переменной экземпляра внутри метода - распространённая практика, часто используемая для реализации мемоизации. Этот метод предполагает кэширование результата ресурсоёмкой операции в переменной, гарантируя, что вычисление будет выполнено только один раз.
def result
@result ||= some_expensive_operation
end
Важно отметить, что доступ к переменным экземпляра невозможен за пределами объекта.
class User
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
end
user = User.new("Artem", "Pecherin")
user.@first_name # syntax error, unexpected tIVAR user.@first_name