Rubyの外部イテレータでブロックつきメソッドを利用する
タグ: ruby / 初版公開: 2013-11-28

Ruby 1.9のEnumeratorによる繰り返し処理では、外部イレテータによる繰り返し処理について説明した。

今回はブロックつきのイテレータを、外部イテレータで書き下して見よう。まず外部イテレータを使わない、以下のプログラムを考える。配列を順にチェックし、/li/にマッチする要素だけを残したリストを作るプログラムだ。

p ['Alice','Bob','Charlie'].select{|person| /li/ === person}

これを外部イテレータで書き下す。selectを呼び出すが、その際はブロックを与えず、Enumeratorを得る。

Enumeratorには次の要素を得るnextと、ブロックの評価結果を与えるfeedメソッドがある。またイテレータの停止は、StopIteration例外により補足でき、resultメソッドで返り値が得られる。

enum = ['Alice','Bob','Charlie'].select
loop do
	begin
		person = enum.next
		enum.feed /li/ === person
	rescue StopIteration => e
		p e.result
		break
	end
end