Enumerable で拡張してみます

ruby には Enumerable というモジュールがあり、集合を扱うクラス(コレクション)にこのモジュールを mix-in すると、Enumerable が備える各種メソッドが使えるようになるそうです。例えば

  • collect
  • find_all
  • map
  • grep

など各種メソッドが使えます。そこで、先の Iterator のコードの BookShelf を Enumerable を使って拡張してみたいと思います。

Enumerable を mix-in するにはウサギ本によるとコレクションで each メソッドを定義すれば良いようです。(Enumerable#max, #min, #sort を使うには <=> 演算子も定義する必要があります。) 先の BookShelf はすでに each メソッドを持っていますので、

class BookShelf
  include Enumerable
  def initialize
    @books = Array.new
  end
  
  def append_book(book)
    @books.push(book)
  end

  def each
    @books.each do |book|
      yield(book)
    end
  end
end

include Enumerable を追加するだけで良かったです。これで Enumerable のメソッドが使えるようになりましたので、

(shelf.find_all do |book| book.name =~ /Daddy/i; end).each do |book|
  puts book.name
end

こんなコードを実行することができました。

$ ruby iterator.rb
Daddy-Long-Legs

プログラミングRuby―達人プログラマーガイド

プログラミングRuby―達人プログラマーガイド