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
- 作者: デビットトーマス,アンドリューハント,まつもとゆきひろ,David Thomas,Andrew Hunt,田和勝
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2001/09/01
- メディア: 単行本
- 購入: 6人 クリック: 79回
- この商品を含むブログ (92件) を見る