К какому шаблону 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.
это относится к" Ruby memoization pattern " (сингулярный), как будто есть один шаблон, который мы все должны знать и ссылаться...
Я предполагаю, что они означают что-то вроде:
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
есть ли что-то еще, что я пропустил?
4 ответа:
вот фиксация (и последующее обсуждение), где Memoizable был осужден: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c
автор выступает за
@foo ||= ...
подход и указывает на эту фиксацию в качестве примера для миграции: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3.изменить: Обратите внимание, что я не должен интерпретировать это изменение как значение что все экземпляры
memoize
можно или нужно заменить с этим шаблоном. Я прочитал это как означающее, что Memoizable больше не нужен/не нужен в самом коде Rails. Как отмечают комментарии, Memoizable-это гораздо больше, чем просто обертка вокруг@foo ||= ...
. Если вам нужны эти функции, идите вперед и используйте Memoizable, вам просто нужно будет получить его откуда-то, кроме ActiveSupport (я предполагаю, что кто-то раскошелится на версию gem, если они еще этого не сделали).
другой вариант-использовать Memoist gem:
это прямое извлечение из
ActiveSupport::Memoizable
и можно использовать как падени-в замене. Простоrequire 'memoist'
, иextend ActiveSupport::Memoizable
до
extend Memoist
просто дополнение к верхнему ответу, чтобы запомнить метод класса, используйте следующий шаблон:
class Foo class << self def bar @bar ||= begin # ... end end end end
основываясь на комментариях о фиксация на что ссылается выше авайншток, Я:
ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable }
... потому что я думаю, что буду знать, когда
Memoizable
вырван из ActiveSupport из моего набора RSpec, умирающего прямо из стартовых ворот.