From: Akinori MUSHA Date: 2001-05-15T18:57:52+09:00 Subject: [ruby-list:29671] Re: Enumerator At Tue, 15 May 2001 17:00:43 +0900, Takaaki Tateishi wrote: > obj.enum_with(:each){|x| f(x)} > => [f(e0), f(e1), ..., f(en)] > # ここで,obj.enum_with(:each) => [e0, e1, ..., en] とします. > > のようにenum_withにブロックを取ることができるようにして, > 配列に入れる前にブロックの処理を行なうことができるとひょっと > すると便利かもしれないと感じました. > 実例を挙げると以下のとおりになります.(この場合は無駄なコードですが…) > > "abc".enum_with(:each_byte){|c| c.chr} > => ["a","b","c"]  うーむ。ブロックを与えると collect するということでしょうか。 enum_with が collect するのはあまり自明でない気がします。それ なら collect_with にすればいいと思いますが、そういうメソッドを 作り出すと select_with やら grep_with やらきりがありません。  汎用的になるように enum_with が Enumerable を返すという仕様を 考えたので、特定のメソッドにショートカットを用意するというのには 躊躇してしまいます。 > あと,個人的には, > > Array.enum_with(obj, each){|x| f(x) } > > で,オブジェクトobjのeachメソッドを使ってarrayを作るというのは > どうでしょうか? > eachのデフォルト値は :each で,ブロックは省略可能です. > Array.enum_with に対する機能的なメリットはないですが,どのクラ > ス/モジュールのメソッドにするかとか,このためだけにモジュール > を include しなければならないという煩わしさは解消されると思いま > す.  メソッド名は collect の方が適当ですね。Array に入れるのも変 なので、 Enumerable に入れて Enumerable::each(obj, method=:each) {|i| ...} Enumerable::collect(obj, method=:each) {|i| ...} Enumerable::to_a(obj, method=:each) {|i| ...} .. という手はありそうです。ただ、すべてのインスタンスメソッドに ついて同名のモジュールメソッドを定義するというのは無駄を感じる かな。それと Enumerable::each という語感がいまいちかも。  今の提案だと ary.enum_with(:each).collect {|x| f(x) } Enumerator::new(ary, :each).collect {|x| f(x) } でできますので、敢えて要るかな、という気はします。 -- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp "Freeze this moment a little bit longer, make each impression a little bit stronger.. Experience slips away -- Time stand still"