Подтвердить что ты не робот

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

Есть ли что-то еще, что я пропустил?

4b9b3361

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