[#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:38432] Re: Enumerable#gather_each

From: Tanaka Akira <akr@...>
Date: 2009-05-11 17:00:49 UTC
List: ruby-dev #38432
In article <E1M2t0u-0000Aa-Sd@x61.netlab.jp>,
  Yukihiro Matsumoto <matz@ruby-lang.org> 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]

In This Thread