我有一个名为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
答案 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