From: Yukihiro Matsumoto Date: 2009-05-20T01:05:05+09:00 Subject: [ruby-dev:38504] Re: [Feature:trunk] enhancement of Array#drop まつもと ゆきひろです In message "Re: [ruby-dev:38500] Re: [Feature:trunk] enhancement of Array#drop" on Wed, 20 May 2009 00:06:19 +0900, "U.Nakamura" 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が全 削除であるべきだったような気もしますが、ちょっと手遅れな感じ がしますね。 いずれにしても中田パッチの導入は賛成しません。 まつもと ゆきひろ /:|)