web-dev-qa-db-ja.com

ActiveSupport :: Memoizableが参照するRuby memoizeパターンはどれですか?

したがって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」(単数形)を指し、私たち全員が知って参照すべき1つのパターンがあるように...

私はそれらが次のようなものを意味すると思います:

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

他に見逃したものはありますか?

54
bodacious

Memoizableが廃止されたコミット(およびその後の議論)は次のとおりです。 https://github.com/Rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c

著者は、移行の例として@foo ||= ...アプローチと このコミットを指す を推奨しています: https://github.com/Rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b

編集:この変更は必ずしもmemoizeのすべてのインスタンスをこのパターンで置き換えることができる、または置き換える必要があることを意味するとは限らないことに注意してください。 Railsコード自体でMemoizableが不要/不要になっているという意味です。コメントで指摘されているように、Memoizableは@foo ||= ...の単なるラッパーではありません。これらの機能が必要な場合は、先に進んでMemoizableを使用してください。ActiveSupport以外の場所から取得する必要があります(まだgemバージョンが作成されていない場合は、誰かがgemバージョンをforkすると思います)。

37
avaynshtok

別のオプションはMemoist gemを使用することです:

これはActiveSupport::Memoizableからの直接抽出であり、ドロップイン置換として使用できます。ただrequire 'memoist'と変更

extend ActiveSupport::Memoizable

extend Memoist
32
jcfischer

上の答えに加えて、クラスメソッドをメモするには、次のパターンを使用します。

class Foo
  class << self
    def bar
      @bar ||= begin
        # ...
      end
    end
  end
end
2
dsager

commit上記でavaynshtokによって参照されています に関するコメントに基づいて、私はこれで進めます:

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

... MemoizableがActiveSupportから取り除かれると、RSpecスイートから開始ゲートですぐに消えてしまうと思います。

0
aec