如何在我的课堂上使用Enumerable mixin?

我有一个名为Note的类,它包含一个名为time_spent的实例variables。 我想能够做到这样的事情:

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

这可能通过在Enumerable模块中混合? 我知道你应该添加include Enumerable类,然后定义each方法,但是应该每个方法是类或实例方法? 什么在each方法?

我正在使用Ruby 1.9.2

这很容易,只需包含Enumerable模块并定义一个each实例方法,而这个方法通常会使用其他类的each方法。 这是一个非常简单的例子:

 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) 

有关更多信息,我build议您阅读以下文章: Ruby Enumerable Magic:The Basics 。

在你的问题的上下文中,如果你通过一个访问者公开的是一个集合,你可能不需要为包含Enumerable而烦恼。

枚举的文档如下:

枚举的 mixin提供了具有几种遍历和search方法的集合类,并具有sorting的能力。 这个类必须提供一个方法, 每个方法都会产生收集的连续成员。 如果使用Enumerable#max min#sort ,集合中的对象也必须实现一个有意义的<=>运算符,因为这些方法依赖于集合成员之间的顺序。

这意味着执行每个<=>将做的伎俩。

请参阅: Enumerable