web-dev-qa-db-fra.com

Quel modèle de mémo 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 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é?

54
bodacious

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).

37
avaynshtok

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
32
jcfischer

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
3
dsager

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.

0
aec