ЗмістНатисність на посилання, щоб перейти до потрібного місця
Memoization - це коли Ruby "запам’ятовує" результат обчислення, щоб не рахувати знову. Використовується для оптимізації - особливо, коли метод викликається багато разів.
Як працює @x ||= ...
@x ||= fetch_x
означає:
Якщо @x ще не має значення (тобто nil або false), тоді виконай fetch_x і збережи результат у @x. Інакше - просто поверни вже збережене.
Різниця з простим присвоєнням
@x = fetch_x # виконує fetch_x КОЖЕН раз @x ||= fetch_x # виконує fetch_x тільки ПЕРШИЙ раз
Наприклад:
def expensive puts "Calculating..." 42 end def answer @answer ||= expensive end answer # => Calculating... 42 answer # => 42 (без обчислення вдруге!)
Але обережно:
||= не спрацює, якщо значення може бути false:
@flag ||= true # якщо @flag = false, Ruby вважатиме це "порожнім" і перепише його на true
Якщо потрібно зберегти навіть false, краще писати:
@flag = true if @flag.nil?
Цей допис поки що не має жодних доповнень від автора/ки.