便利なイテレータメソッド

Iteratorクラスには次のような便利なメソッドが用意されています。Rubyと違い、mapなどは配列を返さず、再びイテレータを返します。これらのメソッドは、所謂デザインパターンで言うDecorator パターンとなっています。

ではサンプルです。

100.times //Integer::timesは、[0〜自身の数字)までを反復するイテレータを返す
   .filter(|x|x%2==0) // 偶数だけ取り出そう
   .map(|x|x*2) // 2倍にする
   .take(10) // 最高10個だけ取り出そう
   .join("-") // ハイフンで文字列連結 
   .p; // 出力

//=>0-4-8-12-16-20-24-28-32-36

リファレンス

collect: method(conv)
map: method(conv)

元のイテレータのブロックパラメータをconv関数で変換したオブジェクトを反復するイテレータを作成し返す

[10, 20, 30].map(|x| x*2){
	it.p;
}
//=> 20
//=> 30
//=> 40
select: method(pred)
filter: method(pred)

元のイテレータのブロックパラメータをpred述語関数に渡し、結果真を返すオブジェクトだけを反復するイテレータを作成し返す

[1, 2, 3].filter(|x| x%2==1){
	it.p;
}
//=> 1
//=> 3
to_a: method()

要素を集め、配列にして返す

[1, 2, 3].filter(|x| x%2==1).map(|x| x*2).to_a.p;
//=> [2, 6]
join: method(sep:",")

要素を文字列sepを挟んで一つの文字列にして返す

[1, 2, 3].map(|x| x*2).join("::").p;
//=> 1::2::3
with_index: method(start:0)

番号をブロックパラメータに付加するイテレータを返す

[45, 12, 33].map(|x| x*2).with_index{ |index, value|
	index~"-"~value .p;
}
//=> 0-45
//=> 1-12
//=> 2-33
cycle: method()

元のイテレータのブロックパラメータを保存し、無限に繰り返すイテレータを作成し返す

[4, 8, 11].map(|x| x*3).cycle{
	it.p;
}
//=> 12
//=> 24
//=> 33
//=> 12
//=> 24
//=> 33
// 以下繰り返し
break_if: method(pred)

元のイテレータのブロックパラメータをpred述語関数に渡し、結果真を返す場合、そこで反復を停止するイテレータを作成し返す

[7, 5, 3, 2, 1, 3].break_if(|x| x%2==1){
	it.p;
}
//=> 7
//=> 5
//=> 3
take: method(times)

times個要素を反復したらそこで停止するイテレータを返す

[5, 3, 7].cycle.take(5).join.p;
// 5,3,7,5,3