Gdy jakaś metoda wykonuje kosztowne obliczenia, a jej wyniku używamy wielokrotnie, rozsądnym jest obliczenia wykonać raz, a wynik zapamietać, tzw. cachowanie za pomoca zmiennych instancji. W takim wypadku, najczęsciej używamy idiomu "||="
class Bar
def foo
@foo ||= lambda {
# jakies kosztowne obliczenia
...
}.call
end
end
Od railsów 2.2 możemy korzystać z metody :memoize, należy dodać metody z modułu ActiveSupport::Memoizable jako metody klasy.
class Bar
extend ActiveSupport::Memoizable
def foo
# jakies kosztowne obliczenia
...
end
memoize :foo
end
Spowoduje to że za pierwszym wywołaniem metody :foo, metoda ta faktycznie zostanie wywołana, a wartość przez nią zwrócona zapamiętana (dziala to tak jak cachowanie w zmiennej instancji, czyli tylko w obrebie danego obiektu).
Każde następne wywołanie metody :foo, na tym konkretnym obiekcie, spowoduje zwrócenie zapamiętanej wartośći.
Jeśli chcemy wymusić wywołanie metody (tzn. bez cachu), jako ostatni parametr należy podać wartość true.
Linki
Module ActiveSupport::Memoizable
A nie czasem gem memoize? (pewnie i tak jedno jest wziete z drugiego, pytanie tylko czy memoize jest wyciagniete z railsow czy raczej railsy wchlonely memoize ;])
Za pomocą
foo ||= sth masz tylko zapamiętane w obrębie _jednego_ obiektu i jego cyklu życia. @foo ||= sth dostepne we wszystkich obiektach klasy.Memoizacja dużo więcej daje przy metodach z parametrami np. sqr(2), sqr(4).