松尾です。
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!にするというのは副作用がかなり大きいと思いますが。