[#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:38504] Re: [Feature:trunk] enhancement of Array#drop

From: Yukihiro Matsumoto <matz@...>
Date: 2009-05-19 16:05:05 UTC
List: ruby-dev #38504
まつもと ゆきひろです

In message "Re: [ruby-dev:38500] Re: [Feature:trunk] enhancement of Array#drop"
    on Wed, 20 May 2009 00:06:19 +0900, "U.Nakamura" <usa@garbagecollect.jp> writes:

|| drop_whileとは違うのですね。
|
|私が勘違いしてなければ、drop_whileは「ある条件に合致する要素
|より前の要素を全て削除する」ですから、私が欲しい物とは違うよ
|うです。

違います。drop_whileは「ある条件に合致する間、要素を先頭から
削除する」です。RDocから例題を引用すると

    a = [1, 2, 3, 4, 5, 0]
    a.drop_while {|i| i < 3 }   # => [3, 4, 5, 0]

です。これは、うささんが最初に書いた

>Rubyでスクリプトを書いていて、配列から、ある条件に合致する先
>頭の要素のみを削除する、という処理を書きたい場面に出会ったこ
>とが何度かあります。

という表現には合致すると思いました。だからこそ、わざわざ
「drop_while とは違うのですね」と聞いたわけで。

ただ、なかださんが作ったパッチの挙動が

>  [:a, :b, :a, :b].drop(1){|e| e == :b} #=> [:a, :a, :b]
>  [:a, :b, :a, :b].drop(2){|e| e == :b} #=> [:a, :a]

だそうですから、これは「引数で指定した範囲内で条件を満たす要
素を削除する」メソッドになっています。うささんのほしいものは
こっちなんですか?

そういうメソッドが存在してはいけないとは言いませんが、だとし
ても、dropの拡張としては反対します。

  * まずブロックを与えない場合と与えた場合で引数の意味がまっ
    たく異なる(与えない場合は削除する要素数、与える場合は検
    索する範囲)

  * dropだけそのようなニーズが特に高いとはにわかに信じられな
    い。やるなら、むしろ、範囲を制限するフィルタとなるような
    Enumerator を返すメソッドを用意して、

      ary.xxx(0,1).delete(elem)

    のような対応をすべきではないか(xxxのところにはlensとか
    filterとか適当に)。

結局、うささんの本当にほしいものがなんなのかよくわからないで
います。なかださんが作ったというパッチはうささんのほしいもの
の中途半端な一般化のようにもみえます。

|戻り値や対象未発見時の例外の有無などを無視すれば、私が欲しい
|物は ary.delete_at(ary.index(elem)) と書けます。

??

でも、これだとひとつしか取り除けませんが。いや、待てよ。「あ
る条件に合致する先頭の要素のみ」ってのは「先頭から条件を満た
す要素をすべて削除する」drop_whileとは違って、「先頭じゃなく
てもいいから条件を満たす最初のひとつだけ削除する」ってことで
すか?

もしかして、そういうこと? 気づくのが遅い?

それなら、ほしいものはむしろ「最初のひとつしか削除しない
delete」なんじゃないですか? delete_firstとかdelete_onceとか
なんとか。むしろdeleteがひとつ要素を削除して、delete_allが全
削除であるべきだったような気もしますが、ちょっと手遅れな感じ
がしますね。

いずれにしても中田パッチの導入は賛成しません。

                                まつもと ゆきひろ /:|)

In This Thread