From: Akinori MUSHA Date: 2009-05-10T20:13:02+09:00 Subject: [ruby-dev:38421] Re: Enumerable#gather_each --pgp-sign-Multipart_Sun_May_10_20:13:22_2009-1 Content-Type: text/plain; charset=ISO-2022-JP At Sun, 10 May 2009 08:53:31 +0900, NARUSE, Yui wrote: > わたしもバッファを用意してーというのは考えたのですが、 > 田中さんのgather_eachで可能なことが、 > gather_eachより複雑になってしまったらダメなんじゃないですかね。  gather_each で可能なこと、つまり gather_each の結果がそのまま ユーザが得たい最終結果となるケースは十分に多いのでしょうか。  パラグラフのように同質のものの繰り返しならぴったりですが、そう でない場合は、分割された個々が何であるかという情報が失われている ので処理の下流で再び検査しなければなりませんよね。また、捨てる 機能も必要なことが少なくないと思います。  おそらくそれらは守備範囲外とするのでしょうが、範囲内としている 部分が十分に広いのか、そして実際の応用ニーズとの間に隙間はないか という疑問を持っています。それがマッチするのなら、適切な名前で 追加すればいいと思います。 > 田中さんのgather_eachでできることは、これ以上概念を増やさず > ほぼ同等の記述量でこなせつつ、自由度もあげられないといけないのかなと。 > > RubyなんでBufferみたいな概念を導入しても意外とすっきりするんですが、 > そこで甘えちゃいけないんじゃないかと思うのですよ。 > > # というか、これってバッファは別に提供して、 > # Enumerable版injectでやるべきな気も  それは一つあるんですが、 yield を保留し、どこかのタイミングで 明示的に指定したものを yield するという機能が要求されるので、 yielder なりそれを包含する buffer なりを渡すというAPIは必要だと 思います。  ときどき select と map を連結させることがありますが、それを いっぺんに可能にする機能はほしいと思っています。たとえばこんな 感じです。 module Enumerable def with_yielder(&block) Enumerator.new { |yielder| each { |x| block.call(x, yielder) } } end end # 整数の書いてある行を抽出し、数列にする p "abc\n123\n\n456\ndef\n".lines.with_yielder { |line, yielder| if m = /^([+\-]?\d+)$/.match(line) yielder << m[1].to_i end }.to_a #=> [123, 456]  これの前に with_object({}) でバッファやステータスを取るための 領域を付加すれば、メソッドチェーンでバッファを実装できますね。 > で、考えたのですが、ChangeLogやmboxの場合に対応するには、 > 直前の要素の分類結果がわかればそれで足りるんじゃないですかね。 > 結局これらは、 > * 特定の要素は自分が分類結果 > * それ以外は直前の分類結果と同じ > というルールなので、 > arg = lambda {|l, current| l =~ /^\S/ ? self : current } > みたいにすればよいかなぁと。 > > これならば田中さんのgather_eachで可能だったことは、 > currentを読み捨てればいいだけなので全く同じコードで可能になります。  これはよさそうです。 -- Akinori MUSHA / http://akinori.org/ --pgp-sign-Multipart_Sun_May_10_20:13:22_2009-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkoGttIACgkQkgvvx5/Z4e6llQCdH2iT//B/KcRETy116E9yvh5U XRcAnAjSojpyrmd9V+145g65TMj9pxPs =vQ8L -----END PGP SIGNATURE----- --pgp-sign-Multipart_Sun_May_10_20:13:22_2009-1--