54 votes

À quel motif de mémorisation Ruby se réfère ActiveSupport :: Memoizable?

Ainsi, dans Rails 3.2, ActiveSupport :: Memoizable est obsolète.

Le message se lit comme suit:

 DEPRECATION WARNING: ActiveSupport::Memoizable is deprecated and will be removed in future releases,simply use Ruby memoization pattern instead.
 

Cela fait référence au "modèle de mémoisation Ruby" (singulier) comme s'il y avait un modèle que nous devrions tous connaître et auquel nous devrions nous référer ...

Je présume qu'ils veulent dire quelque chose comme:

 def my_method
  @my_method ||= # ... go get the value
end
 

ou

 def my_method
  return @my_method if defined?(@my_method)

  @my_method = # ... go get the value
end
 

Y a-t-il autre chose que j'ai manqué?

38voto

avaynshtok Points 2064

Voici le commettre (et discussion) où Memoizable était obsolète: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c

L'auteur préconise l' @foo ||= ... approche et les points à ce commit comme un exemple pour la migration: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3.

Edit: Notez que je n'ai pas forcément interpréter ce changement comme signifiant que toutes les instances de l' memoize peut ou doit être remplacé avec ce modèle. Je l'ai lu en ce sens que Memoizable n'est plus nécessaire/voulu dans les Rails du code lui-même. Comme les commentaires le soulignent, Memoizable est beaucoup plus que juste un wrapper autour de @foo ||= .... Si vous avez besoin de ces fonctionnalités, aller de l'avant et à l'utilisation Memoizable, vous aurez juste à obtenir à partir de quelque part d'autre que ActiveSupport (je suppose que quelqu'un va à la fourche d'un joyau de la version, si elles n'ont pas déjà).

32voto

jcfischer Points 464

Une autre option consiste à utiliser le bijou Memoist:

Il s’agit d’une extraction directe de ActiveSupport::Memoizable et peut être utilisé comme solution de remplacement. Juste require 'memoist' et changement

 extend ActiveSupport::Memoizable
 

à

 extend Memoist
 

2voto

dsager Points 68

Juste un ajout à la première réponse, pour mémoriser une méthode de classe, utilisez le modèle suivant:

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

0voto

aec Points 77

Basé sur les commentaires sur le commit référencés ci-dessus par avaynshtok , je vais avec ceci:

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

… Parce que je suppose que je saurai quand Memoizable est extrait d'ActiveSupport de ma suite RSpec en train de mourir de la porte de départ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X