[#30549] [ANN] Ruby 1.8.6 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 をリリースしました。

14 messages 2007/03/12

[#30553] help: lib/shell for ruby 1.9 — keiju@... (Keiju ISHITSUKA)

けいじゅ@いしつかです.

13 messages 2007/03/13
[#30585] Re: help: lib/shell for ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/03/15

まつもと ゆきひろです

[#30587] Re: help: lib/shell for ruby 1.9 — keiju@... (石塚圭樹) 2007/03/15

けいじゅ@いしつかです.

[#30588] Re: help: lib/shell for ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/03/15

まつもと ゆきひろです

[ruby-dev:30485] Re: Arrayのメソッド増強について

From: Minero Aoki <aamine@...>
Date: 2007-03-05 00:49:12 UTC
List: ruby-dev #30485
青木です。

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ってのも分かるような分からないような。

このメソッドはものすごく欲しいというわけでもないので、
とりあえず保留にさせてください。何かものすごく使い
たくなる例が出たら実例をつけてまた提案します。

--
青木峰郎


In This Thread

Prev Next