From: Minero Aoki Date: 2007-03-05T09:49:12+09:00 Subject: [ruby-dev:30485] Re: Arrayのメソッド増強について 青木です。 On 2007/02/26, at 12:21, Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > |1.9 で String#each がなくなりましたが、どうにも不便です。 > |なんで不便なのか考えてみたところ、Array のメソッドが > |String に比べて弱いのが原因ではないかと考えるようになり > |ました。そこで、以下のようなメソッドを新たに導入する > |ことを提案します。 > > 仕様が簡単で、名前も納得できたtakeとdropは早速 > trunkに取り込 > みます。残りはもうちょっと考えましょう。 ありがとうございます。 > |--- Enumerable#split(max = nil) {|item| .... } > | > |each で得られる要素を順番にブロックに渡し、ブロックが > |真を返したところで分割して、配列の配列を返す。最大 max > |個まで分割する。max = nil のときは無制限に分割する。 > |(非破壊的) > | > |例 > | p [1, 2, 3, 4, 5].split {|i| i % 2 == 0 } #=> [[1], [3], [5]] > | > |他の言語での例: Haskellのbreakを繰り返し適用する場 > |合に相当 > > String#splitとの類推が効くという話ではありますが、逆に引数パ > ターンがちょっと違うので混乱しそうな気もします。Stringは > もう > Enumerableをincludeしていないので問題ないのかな? そうですねえ。確かに自分で書いててもちょっと躊躇しました。 素直に break でもいいのかなあ。でも Haskell だと span と break が対になってるから、Ruby でも span と break は 対になるような 動作にしたほうがいいと思うんですよね。だから span が二つに 分割するメソッドだとすると、break も二つに分割すべきでしょ う。 ということは、二つに分割する break と、二つ以上に分割する break_all があればよいのだろうか……。all はちょっと違うか。 > |--- Enumerable#span {|item| ... } > | > |配列の要素のうちブロックが真を返す先頭部分と残りの部分に > |分割して 2 要素の配列で返す。(非破壊的) > | > |例 > | p [1, 2, 3, 1, 2, 3].span {|item| item < 3 } # => [[1, 2], [3, > |1, 2, 3]] > | > |他の言語での例: Haskellのspan > > 個人的にはこの動作にspanという名前は違和感があるのですが。 > Haskellが採用しているなら問題ないのかな? いや、わたしもさほどしっくり来てるわけではないんですが、 何も例がないよりはいいかな、というだけの話です。 英語の語感はよくわかりませんが、「ブロックが真を返す 区間 (span)」という意味ではそうおかしくないようにも 思います。 > |--- Array#reverse_drop {|item| .... } 別名案:rstrip, > |reject_tail, reject_last > | > |配列の要素のうちブロックが真を返す要素を末尾から > |すべて除いた残りの配列を返す。(非破壊的) > | > |例 > | p [1, 2, 3, 4, 5].reverse_drop {|i| i > 3 } # => [1, 2, 3] > > 名前に違和感があります。String#rindexからの類推だと > rdropなん > ですが...。 あ、個人的には rdrop でもまったく問題ないと思います。 これはとにかく機能さえあれば満足です。 > |--- Array#drop_both {|item| .... } 別名案:strip > | > |配列の要素のうちブロックが真を返す要素を先頭と末尾の > |両方からすべて除いた残りの配列を返す。(非破壊的) > | > |例 > | p [1, 2, 3, 4, 3, 2, 1].drop_both {|i| i < 3 } # => [3, 4, 3] > > これも名前が。stripってのも分かるような分からないような。 このメソッドはものすごく欲しいというわけでもないので、 とりあえず保留にさせてください。何かものすごく使い たくなる例が出たら実例をつけてまた提案します。 -- 青木峰郎