2012-02-03 3 views
53

Tak więc w Railsach 3.2, ActiveSupport :: Memoizable został wycofany.Które z wzorców notowanych w Ruby obsługuje ActiveSupport :: Memoizable?

Przesłanie brzmi:

DEPRECATION WARNING: ActiveSupport::Memoizable is deprecated and 
will be removed in future releases,simply use Ruby memoization 
pattern instead. 

To odnosi się do "Ruby memoization pattern" (liczba pojedyncza), a jeśli istnieje jeden wzorzec wszyscy powinniśmy znać i odnoszą się do ...

Przypuszczam, że coś znaczyć jak:

def my_method 
    @my_method ||= # ... go get the value 
end 

lub

def my_method 
    return @my_method if defined?(@my_method) 

    @my_method = # ... go get the value 
end 

Czy jest jeszcze coś, co przeoczyłem?

+0

Jeśli chcesz „false” lub „zero”, to nie będzie zapisany przy użyciu memoizable Ruby. Jeśli chcesz zaimplementować własne opakowanie, które można zapamiętać, dodaj sposób zapisywania "false" i "zero". – rubies

Odpowiedz

36

Oto zatwierdzenia (i późniejsze omówienie) w Memoizable się nieaktualne: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c

Autor zaleca podejście @foo ||= ... i points to this commit jako przykład migracji: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3.

Edytuj: Pamiętaj, że niekoniecznie interpretuję tę zmianę w ten sposób, że wszystkie wystąpienia memoize można lub należy zastąpić w/tym wzorcu. Przeczytałem to w ten sposób, że funkcja Memoizable nie jest już potrzebna/potrzebna w samym kodzie Rails. Jak wynika z komentarzy, funkcja Memoizable to znacznie więcej niż zwykłe opakowanie o wartości około @foo ||= .... Jeśli potrzebujesz tych funkcji, skorzystaj z funkcji Memoizable, po prostu musisz ją pobrać z innego miejsca niż ActiveSupport (domyślam się, że ktoś rozwiąże wersję z klejnotem, jeśli jeszcze tego nie zrobił).

31

Inną opcją jest użycie Memoist GEM:

Jest to bezpośrednie wydobycie z ActiveSupport::Memoizable i może być stosowany jako zamiennik. Wystarczy require 'memoist' i zmienić

extend ActiveSupport::Memoizable 

do

extend Memoist 
0

oparciu o komentarze na the commitreferenced above by avaynshtok, idę z tym:

ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable } 

... bo ja figura będę wiedział kiedy Memoizable jest wyrwany z ActiveSupport z mojego pakietu RSpec, który umiera zaraz po wyjściu z bramki początkowej.

3

tylko dodatkiem do górnej odpowiedź do memoize metoda klasy użyć następującego wzoru:

class Foo 
    class << self 
    def bar 
     @bar ||= begin 
     # ... 
     end 
    end 
    end 
end 
Powiązane problemy