From: Minero Aoki Date: 2007-02-24T14:21:37+09:00 Subject: [ruby-dev:30407] Arrayのメソッド増強について 青木です。 1.9 で String#each がなくなりましたが、どうにも不便です。 なんで不便なのか考えてみたところ、Array のメソッドが String に比べて弱いのが原因ではないかと考えるようになり ました。そこで、以下のようなメソッドを新たに導入する ことを提案します。 --- 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を繰り返し適用する場 合に相当 --- Enumerable#span {|item| ... } 配列の要素のうちブロックが真を返す先頭部分と残りの部分に 分割して 2 要素の配列で返す。(非破壊的) 例 p [1, 2, 3, 1, 2, 3].span {|item| item < 3 } # => [[1, 2], [3, 1, 2, 3]] 他の言語での例: Haskellのspan --- Array#take {|item| .... } 別名案:take_while, slice{} 配列の要素のうちブロックが真を返す要素を先頭から すべて集めて配列で返す。(非破壊的) 例 p [1, 2, 3, 2, 1].take {|i| i < 3 } # => [1, 2] 他の言語での例: HaskellのtakeWhile --- Array#drop {|item| .... } 別名案:lstrip, drop_while, reject_head 配列の要素のうちブロックが真を返す要素を先頭から すべて除いた残りの配列を返す。(非破壊的) 例 p [1, 2, 3, 4, 5].drop {|i| i < 3 } # => [3, 4, 5] 他の言語での例: HaskellのdropWhile --- Array#reverse_drop {|item| .... } 別名案:rstrip, reject_tail, reject_last 配列の要素のうちブロックが真を返す要素を末尾から すべて除いた残りの配列を返す。(非破壊的) 例 p [1, 2, 3, 4, 5].reverse_drop {|i| i > 3 } # => [1, 2, 3] --- Array#drop_both {|item| .... } 別名案:strip 配列の要素のうちブロックが真を返す要素を先頭と末尾の 両方からすべて除いた残りの配列を返す。(非破壊的) 例 p [1, 2, 3, 4, 3, 2, 1].drop_both {|i| i < 3 } # => [3, 4, 3] -- 青木峰郎