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 suppose 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é?
Voici le commit (et la discussion qui a suivi) où Memoizable était obsolète: https://github.com/Rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c
L'auteur préconise l'approche @foo ||= ...
et pointe vers ce commit à titre d'exemple de migration: https://github.com/Rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3 .
Edit: Notez que je n’interprète pas nécessairement cette modification comme signifiant que toutes les instances de memoize
peuvent ou doivent être remplacées avec ce modèle. Je l'ai lu comme signifiant que Memoizable n'est plus nécessaire/voulu dans le code Rails lui-même. Comme le soulignent les commentaires, Memoizable est bien plus qu’un simple wrapper autour de @foo ||= ...
. Si vous avez besoin de ces fonctionnalités, allez-y et utilisez Memoizable, vous devrez simplement vous en procurer un autre qu'ActiveSupport (je suppose que quelqu'un achètera une version de Gem, si ce n'est déjà fait).
Une autre option consiste à utiliser le joyau Memoist:
Il s’agit d’une extraction directe à partir de ActiveSupport::Memoizable
et peut être utilisé comme remplacement immédiat. Juste require 'memoist'
et changer
extend ActiveSupport::Memoizable
à
extend Memoist
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
D'après les commentaires sur le commitré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
sera extrait d'ActiveSupport de ma suite RSpec en train de mourir de la porte de départ.