遠藤です。

2011年5月10日23:09 Shota Fukumori <sorah / tubusu.net>:
> 共通なconvensionを用意すると発散すると書かれていたのにやってしまいましたが、
>
> Enumerator#deferを定義してこのような形にすると良いのではと思いました。

見栄えはいいですが、残念ながら共通の convension にはなりません。

$ ./ruby -e 'p [1, 2, 3].select {|x| x.even? }'
[2]

$ ./ruby -e 'p [1, 2, 3].select.defer {|x| x.even? }.to_a'
[false, true, false]


この問題は、map やら select やらが Array を返すこと前提で、内部的に
rb_ary_push を呼んでしまっているため、中間データ生成を回避しようが
ないということです。なので mapL 、selectL というように各メソッドごとに
対応していかざるを得ません。

Enumerator から Array を得るのは to_a 一発なので、デフォルトで
Array ではなく Enumerator を返してくれれば解決なんですが。
互換性以外は。。

-- 
Yusuke Endoh <mame / tsg.ne.jp>