К какому шаблону 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 54

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, умирающего прямо из стартовых ворот.