arrayのmethod


いくつか便利そうなメソッドを知った。
rubyでプログラムを組んでいると、arrayをよく使う。当然、arrayのmethodも良く使う。arrayとhashをあわせてコレクションと呼ぶらしいが、これにはEnumerabuleのメソッドが数多くある。これをいかに使うかで、プログラムの見通しが良くも悪くもなる。 最近よく使うメソッドは、collect, select, sortなどだろうが、こんなメソッドがあったら、と思うことがある。そのいくつかは、すでにあるメソッドをうまく使うと良いことが分かった。例えば、

a.reject{|l| l~/^#/}
a.grep(/^[^#]/)

の上のような使い方を良くしていたのだが、これは下のように書けることが分かった。ちなみに後者では、空の文字列も除ける。また、sortの時に、いちいち二つのものの比較を書くのが面倒だと思っていたが、

a.sort{|x,y| x.abs<=>y.abs}
a.sort_by{|x| x.abs}

上と同じことを下のように書けるようだ。実際にはこれらは内部処理も異なっているようだが。それから、maxやminはあるけど、sumが無いと思っていたが、これは足すという作業は一般的ではないからだろう。しかし、

a.inject{|s,i| s+i}

とすると、合計を求めることができる。 あと、多項式の値の計算をどうやったらきれいに書けるかで悩んでいる。新しくメソッドを定義すればよいのだが、一行で書けるのならその必要もないし。とりあえず考えたのが、

x=1.2
s=0.0
[0.0,1.0,0.0,-1.0/6].each_with_index{|c,i| s+=c*x**i}
p s

というものだ。これだと、新しく変数を定義する必要がある。次に考えたのが、

x=1.2
p [0.0,1.0,0.0,-1.0/6].reverse.inject{|s,c| s*x+c}

というものだ。これはとりあえずの目的は達しているように思われるが、直感的ではない。今のところこのくらいは仕方が無いのかな。collect_with_indexとかがあればもう少しシンプルに書ける気がする。