ArrayとIterator
配列の要素巡回には次のような方法があります。
普通にfor文で
for(i : 0; i<ary.length; ++i){ println(i); }
Iterator文で
ary.each{ // Array::eachは要素を巡回できるIteratorを返す。 println(it); }
下のは次のように、eachを省いても書けるようになりました。
ary{ println(it); }
これにより、あるメソッドが、戻り値としてIteratorを返すか、配列を返すかに関わらず{}を適用できるようになりました。
foo.hoge{ // 以前は配列を返す場合は foo.foge.each{ とする必要があった。 println(it); }
Xtalでは次のルールを設けます。
「配列を返すメソッドや関数は、将来的にIteratorを返す仕様にしても良い。その逆に現在Iteratorを返すメソッドや関数は、将来的に配列を返す仕様にしても良い」
よって、確実に配列として欲しい場合、to_aを呼び出す必要があります。
Iterator::to_aは各要素を集めた配列を生成して返し、Array::to_aは自分自身を返します。
foo.hoge.to_a;