Project

General

Profile

Actions

Feature #1488

closed

enhancement of Array#drop

Added by usa (Usaku NAKAMURA) almost 16 years ago. Updated almost 14 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-dev:38493]

Description

=begin
こんにちは、なかむら(う)です。

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

無条件で先頭の要素を削除するメソッドとしてはshiftまたはdrop(1)
があり、また、条件に合致した全ての要素を削除するメソッドとし
てはdeleteがありますが、ある条件に合致する先頭の要素のみを削
除しようとすると、意外と複雑な記述になってしまいます。

... という話をIRCでしてみたところ、なかださんに「dropにブロッ
ク引数を追加するのはどうか」と言われました。

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

さらに、第2引数が指定された場合は、{|e| e === 第2引数} とみな
すようにすればさらに便利、とも言われました。

例:
[:a, :b, :a, :b].drop(1, :b) #=> [:a, :a, :b]

私としてはこの仕様が実現されると大変便利と思うのですが、いか
がでしょうか。

なお、なかださんが例のごとく既にパッチを持っています。

それでは。

U.Nakamura
=end


Related issues 1 (0 open1 closed)

Has duplicate Ruby - Feature #1492: enhancement of Array#dropClosedActions
Actions #1

Updated by matz (Yukihiro Matsumoto) almost 16 years ago

=begin
まつもと ゆきひろです

In message "Re: [ruby-dev:38493] [Feature:trunk] enhancement of Array#drop"
on Tue, 19 May 2009 15:58:46 +0900, "U.Nakamura" writes:

|Rubyでスクリプトを書いていて、配列から、ある条件に合致する先
|頭の要素のみを削除する、という処理を書きたい場面に出会ったこ
|とが何度かあります。
|
|無条件で先頭の要素を削除するメソッドとしてはshiftまたはdrop(1)
|があり、また、条件に合致した全ての要素を削除するメソッドとし
|てはdeleteがありますが、ある条件に合致する先頭の要素のみを削
|除しようとすると、意外と複雑な記述になってしまいます。
|
|... という話をIRCでしてみたところ、なかださんに「dropにブロッ
|ク引数を追加するのはどうか」と言われました。

drop_whileとは違うのですね。

|私としてはこの仕様が実現されると大変便利と思うのですが、いか
|がでしょうか。

drop_whileに先頭いくつまでという引数を追加するという考え方も
ありますね。ただし、この場合は

|さらに、第2引数が指定された場合は、{|e| e === 第2引数} とみな
|すようにすればさらに便利、とも言われました。

が自然に実現できませんが。

=end

Actions #2

Updated by usa (Usaku NAKAMURA) almost 16 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:38495] Re: [Feature:trunk] enhancement of Array#drop"
on May.19,2009 16:20:07, wrote:
| |Rubyでスクリプトを書いていて、配列から、ある条件に合致する先
| |頭の要素のみを削除する、という処理を書きたい場面に出会ったこ
| |とが何度かあります。
| |
| |無条件で先頭の要素を削除するメソッドとしてはshiftまたはdrop(1)
| |があり、また、条件に合致した全ての要素を削除するメソッドとし
| |てはdeleteがありますが、ある条件に合致する先頭の要素のみを削
| |除しようとすると、意外と複雑な記述になってしまいます。
| |
| |... という話をIRCでしてみたところ、なかださんに「dropにブロッ
| |ク引数を追加するのはどうか」と言われました。
|
| drop_whileとは違うのですね。

私が勘違いしてなければ、drop_whileは「ある条件に合致する要素
より前の要素を全て削除する」ですから、私が欲しい物とは違うよ
うです。
戻り値や対象未発見時の例外の有無などを無視すれば、私が欲しい
物は ary.delete_at(ary.index(elem)) と書けます。

それでは。

U.Nakamura

=end

Actions #3

Updated by matz (Yukihiro Matsumoto) almost 16 years ago

=begin
まつもと ゆきひろです

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が全
削除であるべきだったような気もしますが、ちょっと手遅れな感じ
がしますね。

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

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

=end

Actions #4

Updated by matz (Yukihiro Matsumoto) almost 16 years ago

  • Status changed from Open to Closed

=begin
redundant
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0