けいじゅ@いしつかです. In [ruby-dev:38935] the message: "[ruby-dev:38935] Re: Enumerator#peek", on Jul/29 00:29(JST) Tanaka Akira writes: >> あるグループに分けて集計したいなら, 下記のような方が Ruby ぽいかも. >> a = %w[banana banana durian orange orange orange] >> a.group_by{|w| w}.each{|key, values| puts "#{key} #{values.size}"} >> MapReduce系では上記のような感じで書くことが多いと思います. > >group_by は残念なことにぜんぶメモリに読み込むことになるんで >すよね。 たしかに, Rubyのはそうなっていますよね. ただ, ソート済みを前提としないで処理できるので, ソートされてない状態の ものをわざわざソートしてコントロールブレーク処理するのと変わらないかも 知れません. >ソート済みであることを前提としてシーケンシャルに処理できるメ >ソッドも当然あり得て、それはそれで考えています。 >[ruby-dev:38392] から始まるスレッドで、ちょっとほったらかし >にしているのですが、忘れているわけではありません。 以前そんな話題がありましたね. 結構参考になるところが多いかも >そういう、シーケンシャルに処理する操作の中で、peek はかなり >低級なところを支援する話にあたります。 なるほど. >狙っているところが違う感じでしょうか。 うーん. Enumeratorってかなり応用的なクラス(Enumerabbleから生成される) なので, peekっていうのは, ちょっと違和感があるかも. >[ruby-dev:38392] からの提案はいろいろと変遷しているのですが、 >現時点での形態の slice_by だと次のように書けます。 > >a = %w[banana banana durian orange orange orange] >a.slice_by {|w| w }.each {|key, values| puts "#{key} #{values.size}" >} ソートされているという前提でですね. ということは, slice_byさえあれば, コントロールブレーク処理ではpeekは必ずしも要らないって言っていません? >まぁ、values が大きくなるとメモリの点では悲しいケースが出て >くるかも知れませんが。 たしかに, fairyでもgroup_byでvaluesを渡すのはどうかと言われています (^^;; >> の様にも書けます. (1)が味噌なんですが... (1)しなくてもちゃんと処理して >> くれるeach_with_peek見たいのがあってもよいかも? > >最初か最後で特別扱いが必要なのであんまりよくないと思います。 それはそうですね. >あと、コントロールブレイクを検索したところ、どうやら複数のキー >を扱うことも珍しくないようです。 >でも、each_with_peek のようなイテレータではこういう多重ルー >プは実現できません。おそらく。 うーむ. >ここで、上記の多重ループは再帰降下パーザとみなすこともできま >す。そのように考えてトークンの取得に相当するところに >Enumerator#{peek,next} を使うと、これは実現できます。 たしかに. ただ: >なぜ内部イテレータでなく、外部イテレータを拡張しているのか、 >という理由はここにあります。 each_with_peekもEnumeratorのつもりなので外部イテレータにできると考えて います. それにslice_byでもEnumeratorとして扱えば実現可能な気がしますが? peekで出来ることが, slice_byの様なものですべて実現可能ではないかも知れ ませんが, slice_byみたいなものの方が好みだなぁ. __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju / ishitsuka.com <<---