====== Iterator ====== コンテナクラスのeachメソッドなどによって生成されます。 多くのメソッドはIteratorを返すため、メソッドチェーンを形成することでイテレートする要素範囲を狭めることが出来ます。 また、Iteratorのメソッドには、要素を引数として呼び出す関数(的なもの)を//pred//などという形で引数として渡すことが出来るものが多いですが、これには関数・メソッド・ラムダ式を使うことが出来ます。特にラムダ式は単純な内容であれば簡潔に書くことが出来るので、Iteratorのメソッドを使うのであれば積極的に使うこととなるかと思います。 traditionalなfor文を使った方が動作は速いです。ただし、差はそこまで大きくないのでどちらでも良いと思います(その差が大きく響いてくるならC++への移植も視野に入れましょう)。 ===== Bug ===== **正確な条件・対象バージョン未確認** Iterable継承クラス(ArrayなりStringなり)のeachで取得したIteratorを何かの変数に代入してそれのメソッドを使おうとすると、うまく動きません。 array : [0, 1, 2, 3]; // うまく動く array.each.with_index.find(|i,x| x==3).p; // うまく動かない(かも?) iter : array.each; iter.with_index.find(|i,x| x==3).p; ===== Example ===== array : (0..19)[]; // 偶数を前半に、奇数を後半にもってくる array.with_index.filter(|i,x| x%2==0).chain(array.with_index.filter(|i, x| x%2==1)).with_index{|current, prev, it| %f[%d : %d => %d](it, prev, current).p; } こんなコード書く人はいないと思いますが、いろいろ使ってみた一例です。 ===== Method ===== |Xtal|C++|name|description| |o|x|[[.:iterator:scan]]| | |o|o|[[.:iterator:ip]]|要素をn個デバッグプリントする| |o|o|[[.:iterator:join]]|要素をセパレータで連結した文字列を返す| |o|o|[[.:iterator:with_index]]|(i, it)を返すイテレータを返す| |o|o|[[.:iterator:collect_map]]|要素を変換した要素を返すイテレータを返す| |o|o|[[.:iterator:select]]|選別された要素を返すイテレータを返す| |o|o|[[.:iterator:filter]]|選別された要素を返すイテレータを返す| |o|o|[[.:iterator:break_if]]|trueを返すまでイテレートするイテレータを返す| |o|o|[[.:iterator:take]]|times回イテレートするイテレータを返す| |o|o|[[.:iterator:zip]]|並列にイテレートするイテレータを返す| |o|o|[[.:iterator:chain]]|直列にイテレートするイテレータを返す| |o|o|[[.:iterator:cycle]]|イテレートする要素をがなくなったら最初からになるイテレータを返す| |o|o|[[.:iterator:max_element]]|イテレートする要素の最大の値を返す| |o|o|[[.:iterator:min_element]]|イテレートする要素の最小の値を返す| |o|o|[[.:iterator:find]]|イテレートする要素から検索し、一致する値を返す| |o|o|[[.:iterator:inject]]| | |o|o|[[.:iterator:with_prev]]|(前回の要素, 今回の要素)を要素とするイテレータを返す|