便利なイテレータメソッド
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