如何在班上使用Enumerable mixin?

时间:2011-08-28 11:24:27

标签: ruby

我有一个名为Note的类,其中包含一个名为time_spent的实例变量。我希望能够做到这样的事情:

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

这可以通过混合Enumerable module来实现吗?我知道你应该向类中添加include Enumerable然后定义一个each方法,但是每个方法应该是一个类还是实例方法? each方法有哪些内容?

我正在使用Ruby 1.9.2

2 个答案:

答案 0 :(得分:85)

这很简单,只需包含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", "B.A. Barracus", "Murdoch", "Hannibal")
#use any Enumerable method from here on
p ateam.map(&:downcase)

有关详细信息,建议您阅读以下文章:Ruby Enumerable Magic: The Basics

在您的问题的上下文中,如果您通过访问者公开的内容已经是一个集合,您可能不必费心包括Enumerable

答案 1 :(得分:3)

Enumerable 文档说明如下:

  

Enumerable mixin提供了几个集合类   遍历和搜索方法,并具有排序的能力。的的   class必须提供一个方法每个,它会产生连续的成员   集合。如果 Enumerable#max #min #sort ,则使用对象   在集合中还必须实现一个有意义的< => 运算符   这些方法依赖于集合成员之间的排序。

这意味着在集合上实现each。如果您对使用#max#min#sort感兴趣,则应对其成员实施<=>

请参阅:Enumerable