2008年
11月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2008-11-16 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とかがあればもう少しシンプルに書ける気がする。