松尾です。

Arrayクラスがなんとなく使い難くて(失礼_o_)、今書いてるスクリプト用に以
下のようなクラスを作って使ってます。

# 皆さんはどうしてるんでしょう? そう思ってるのは僕だけかしら…。

class Array2 < Array

  # 非破壊的filter
  # 与えられたブロックで要素を処理し、その結果の配列を返す。
  def filter2
    return dup.filter{|i| yield(i)}
  end

  # 所謂grep
  # 与えられたブロックが真になる要素だけで作られた配列を返す。
  def grep
    return filter2{|i| if yield(i) then i else nil end}.compact
  end

  # 拡張join
  # 与えられたブロックで処理した後で、sepでjoinする。nilは飛ばす。
  def join2(sep)
    return filter2{|i| yield(i)}.compact.join(sep)
  end

  # 与えられたブロックが真になる最初の要素を返す。
  # findNextは、ない…。
  def findFirst
    each{|i|
      if yield(i) then
	return i
      end
    }

    return nil
  end
end

で、よくよくArrayクラスのメソッド眺めてみると、sortやuniqの様に破壊的
なのと非破壊的なのと両方与えられているメソッドと、そうでないメソッドが
あって。filterなんて非破壊的なのもあって良さそうに思えるし、実際よく使
うので今回filter2を作ったんですね。

なので、そうする事に意味のあるメソッドについては、破壊/非破壊の両方を
持つように揃える、というのは如何でしょうか。

# 今更filterとfilter!にするというのは副作用がかなり大きいと思いますが。