From: Tanaka Akira Date: 2009-05-12T02:00:49+09:00 Subject: [ruby-dev:38432] Re: Enumerable#gather_each In article , Yukihiro Matsumoto writes: > |一度に二つの手続きを渡すのではなく、一つのブロックを受け取りEnumeratorを返すgatherと、従来のeachに分けた方が自然になるのではないでしょうか。 > > 私もそう思います。ただ、Enumerableから「条件を満たす限り連続 気がついたんですが、gather_each を gather と従来の each に分 けると、gather を呼んで作った enumerator に対して何回も each を呼ぶことができてしまいますね。 状態を扱うとこれは問題を生じるかもしれません。 以下は 3の倍数番目を除去するつもりなコードなのですが、最初の to_a は意図どおりに動きますが、2回目の to_a は (i が 0 じゃ ないので) 結果が異なっています。 i = 0 e = %w[a b c d e].gather { i += 1; i % 3 != 0 } p e.to_a #=> [["a", "b"], ["d", "e"]] p e.to_a #=> [["b", "c"], ["e"]] gather でこれを避けるには、以下のようにする必要があります。 e = Enumerator.new {|y| i = 0 %w[a b c d e].gather { i += 1; i % 3 != 0 }.each {|a| y << a } } p e.to_a #=> [["a", "b"], ["d", "e"]] p e.to_a #=> [["a", "b"], ["d", "e"]] この点を考えると、buffer の status には意味があった、という ことかなぁ。 -- [田中 哲][たなか あきら][Tanaka Akira]