На какой шаблон памятки Ruby ссылается ActiveSupport :: Memoizable? - PullRequest
54 голосов
/ 03 февраля 2012

Таким образом, в 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" (в единственном числе), как если бы он былшаблон, который мы все должны знать и ссылаться на ...

Я предполагаю, что они означают что-то вроде:

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 ]

37 голосов
/ 06 февраля 2012

Вот коммит (и последующее обсуждение), где Memoizable устарел: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c

Автор выступает за @foo ||= ... подход и указывает на этот коммит в качестве примера для миграции: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3.

Edit: Обратите внимание, что я не обязательно интерпретирую это изменение как означающее, что все экземпляры memoize могут или должны быть заменены этим шаблоном. Я прочитал это как означающее, что Memoizable больше не нужен / не нужен в самом коде Rails. Как отмечают комментарии, Memoizable - это гораздо больше, чем просто оболочка вокруг @foo ||= .... Если вам нужны эти функции, используйте Memoizable, вам просто нужно получить его где-то, кроме ActiveSupport (я предполагаю, что кто-то раскошелится на версию Gem, если она еще не была).

32 голосов
/ 18 апреля 2012

Другой вариант - использовать камень Memoist:

Это прямое извлечение из ActiveSupport::Memoizable и может использоваться в качестве замены.Просто require 'memoist' и измените

extend ActiveSupport::Memoizable

на

extend Memoist
2 голосов
/ 03 декабря 2013

Просто дополнение к верхнему ответу, чтобы запомнить метод класса, используйте следующий шаблон:

class Foo
  class << self
    def bar
      @bar ||= begin
        # ...
      end
    end
  end
end
0 голосов
/ 08 июня 2012

Основываясь на комментариях к коммиту , на который ссылается выше авайншток , я пойду с этим:

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

… потому что я думаю,знать, когда Memoizable вырвано из ActiveSupport из моего пакета RSpec, умирающего прямо из стартовых ворот.

...