Какой шаблон Ruby memoize поддерживает ActiveSupport:: Memoizable?
Итак, в Rails 3.2 ActiveSupport:: Memoizable устарел.
В сообщении говорится:
DEPRECATION WARNING: ActiveSupport::Memoizable is deprecated and
will be removed in future releases,simply use Ruby memoization
pattern instead.
Он относится к "шаблону memoization Ruby" (сингулярный), как если бы один шаблон мы все знали и ссылались на...
Я предполагаю, что они означают что-то вроде:
def my_method
@my_method ||= # ... go get the value
end
или
def my_method
return @my_method if defined?(@my_method)
@my_method = # ... go get the value
end
Есть ли что-то еще, что я пропустил?
Ответы
Ответ 1
Вот коммит (и последующее обсуждение), где Memoizable устарел: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c
Автор выступает за подход @foo ||= ...
, а указывает на это коммит в качестве примера миграции: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3.
Изменить:
Обратите внимание, что я не обязательно интерпретирую это изменение как означающее, что все экземпляры memoize
могут или должны быть заменены w/this pattern. Я читал это как означающий, что Memoizable больше не нужен/не нужен в коде Rails. Как отмечают комментарии, Memoizable намного больше, чем просто обертка вокруг @foo ||= ...
. Если вам нужны эти функции, продолжайте использовать Memoizable, вам просто нужно получить его откуда-то, кроме ActiveSupport (я предполагаю, что кто-то разветкит версию gem, если они еще не были).
Ответ 2
Другой вариант - использовать памятку Memoist:
Это прямое извлечение из ActiveSupport::Memoizable
и может быть использовано в качестве замены. Просто require 'memoist'
и измените
extend ActiveSupport::Memoizable
к
extend Memoist
Ответ 3
Просто добавление к верхнему ответу, чтобы memoize метод класса использовал следующий шаблон:
class Foo
class << self
def bar
@bar ||= begin
# ...
end
end
end
end
Ответ 4
Основываясь на комментариях фиксация на которую ссылается выше avaynshtok, Im идя с этим:
ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable }
... потому что я полагаю, что я знаю, когда Memoizable
вырывается из ActiveSupport из моего пакета RSpec, умирающего прямо из стартового сервера.