Instance

Инстансные переменные(или переменные экземпляра) определяются с знака @. Неинициализированные переменные экземпляра имеют значение 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