Techioz Blog

クラスで Enumerable ミックスインを使用するにはどうすればよいですか?

概要

Note というクラスがあり、これには time_spent というインスタンス変数が含まれています。次のようなことができるようにしたいです:

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

Enumerable モジュールを混ぜることでこれは可能ですか? include Enumerable をクラスに追加してから各メソッドを定義する必要があることはわかっていますが、各メソッドはクラス メソッドまたはインスタンス メソッドのどちらにする必要がありますか?それぞれのメソッドでは何が行われるのでしょうか?

Ruby 1.9.2を使用しています

解決策

これは簡単です。Enumerable モジュールをインクルードし、各インスタンス メソッドを定義するだけです。これは多くの場合、他のクラスの各メソッドを使用するだけです。非常に単純化した例を次に示します。

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 をわざわざ含める必要はありません。