Comment utiliser le mixin Enumerable dans ma classe?

J’ai une classe appelée Note , qui inclut une variable d’instance appelée time_spent . Je veux pouvoir faire quelque chose comme ça:

 current_user.notes.inject{|total_time_spent,note| total_time_spent + note.time_spent} 

Est-ce possible en mélangeant le module Enumerable ? Je sais que vous êtes censé append include Enumerable à la classe, puis définir each méthode, mais chaque méthode doit-elle être une méthode de classe ou d’instance? Que se passe-t-il dans each méthode?

J’utilise Ruby 1.9.2

C’est facile, il suffit d’inclure le module Enumerable et de définir une méthode d’instance qui, le plus souvent, utilisera simplement each méthode de each classe. Voici un exemple vraiment simplifié:

 class ATeam include Enumerable def initialize(*members) @members = members end def each(&block) @members.each do |member| block.call(member) end # or # @members.each(&block) end end ateam = ATeam.new("Face", "BA Barracus", "Murdoch", "Hannibal") #use any Enumerable method from here on p ateam.map(&:downcase) 

Pour plus d’informations, je recommande l’article suivant: Ruby Enumerable Magic: The Basics .

Dans le contexte de votre question, si ce que vous exposez via un accesseur est déjà une collection, vous n’avez probablement pas besoin de prendre en compte Enumerable .

La documentation Enumerable dit ce qui suit:

Le mixin Enumerable fournit des classes de collecte avec plusieurs méthodes de parcours et de recherche, avec la possibilité de sortinger. La classe doit fournir une méthode chacun , ce qui donne des membres successifs de la collection. Si Enumerable # max , #min ou #sort est utilisé, les objects de la collection doivent également implémenter un opérateur <=> significatif, car ces méthodes reposent sur un classement entre les membres de la collection.

Cela signifie mettre en œuvre chacun et <=> fera l’affaire.

Voir: Enumerable