したがって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
他に見逃したものはありますか?
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すると思います)。
別のオプションはMemoist gemを使用することです:
これはActiveSupport::Memoizable
からの直接抽出であり、ドロップイン置換として使用できます。ただrequire 'memoist'
と変更
extend ActiveSupport::Memoizable
に
extend Memoist
上の答えに加えて、クラスメソッドをメモするには、次のパターンを使用します。
class Foo
class << self
def bar
@bar ||= begin
# ...
end
end
end
end
commit上記でavaynshtokによって参照されています に関するコメントに基づいて、私はこれで進めます:
ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable }
... Memoizable
がActiveSupportから取り除かれると、RSpecスイートから開始ゲートですぐに消えてしまうと思います。