Добавьте атрибут экземпляра (например, @my_attribute
)
И затем определите
def my_attribute
@my_attribute ||= initialize_my_attribute
end
(Примечание: initialize_my_attribute
- это реализованная вами функция / метод, которая будет загружатьнужное вам значение.)
Как это работает: атрибут начинается со значения nil
(мы ничего ему не присвоили).Экземпляр объекта не может получить к нему доступ напрямую, потому что мы не определили атрибут доступа к нему.Вместо этого у нас есть метод, имя которого совпадает с именем атрибута, поэтому при вызове my_object.my_attribute
он выглядит точно так же, как если бы вы обращались к атрибуту, когда фактически вызываете метод экземпляра объекта.
Что происходит в методе?Короткая стрелка ||=
эквивалентна
@my_attribute = (@my_attribute || initialize_my_attribute)
Так что, если @my_attribute
уже имеет значение, это значение возвращается.В противном случае @my_attribute
получает присвоенное значение (а затем возвращается).Другими словами: значение будет загружено в @my_attribute
при первом обращении к нему (и только в первый раз).
И вуаля!Ленивая загрузка.