[#38392] Enumerable#gather_each — Tanaka Akira <akr@...>

ときに、複数行をまとめて扱いたいことがあります。

47 messages 2009/05/09
[#38394] Re: Enumerable#gather_each — ujihisa <ujihisa@...> 2009/05/09

ujihisaと申します。

[#38400] Re: Enumerable#gather_each — Yukihiro Matsumoto <matz@...> 2009/05/09

まつもと ゆきひろです

[#38399] Re: Enumerable#gather_each — "Akinori MUSHA" <knu@...> 2009/05/09

At Sat, 9 May 2009 15:30:20 +0900,

[#38405] Re: Enumerable#gather_each — Tanaka Akira <akr@...> 2009/05/10

In article <86r5yy2nrg.knu@iDaemons.org>,

[#38417] Re: Enumerable#gather_each — "Akinori MUSHA" <knu@...> 2009/05/10

At Sun, 10 May 2009 10:08:47 +0900,

[#38524] [Bug #1503] -Kuをつけた時、/[#{s}]/n と Regexp.new("[#{s}]",nil,"n") で実行結果が異なる — sinnichi eguchi <redmine@...>

Bug #1503: -Kuをつけた時、/[#{s}]/n と Regexp.new("[#{s}]",nil,"n") で実行結果が異なる

8 messages 2009/05/22

[ruby-dev:38421] Re: Enumerable#gather_each

From: "Akinori MUSHA" <knu@...>
Date: 2009-05-10 11:13:02 UTC
List: ruby-dev #38421
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/

In This Thread