これも車輪の再発明か

Rubyでとりあえず簡単なプログラムは書けるようになったので、cygwinemacsを導入がてらproject eulerの問題を解いてみた。
余談だがcygwinのapt-cygの挙動がどうもおかしい様子。
既に気づいていた人がいるらしく、七日前の記事に修正したという内容が載っていたが自前の環境での修正方法がわからないので放っておいている。
irbが使えないのが地味につらい。

さて、rubyに触れていてきづいたこと。
CやJavaでいうfor文を回す時pythonではrange関数を使う。
rubyでこれと同じような動作をするRangeクラスがある。
こちらは関数ではなくクラスとして定義されていて、こういう使い方をする。

for i in 1..10
  print "#{i} "
end
#=> 1 2 3 4 5 6 7 8 9 10

で、じゃあ「10..1」という書き方ができないのかと試してみたら動かない。
エラーではなくそこの部分が無視されてしまう。
じゃ、1..10.reverseで、と思ったらエラーが出た。
(最初、Rangeクラスというものを知らなくて、てっきり配列だと思っていたのだ。)
Rangeクラスにはreverseはないらしい。
そこで仕方なくdownto()を使うことにした。

10.downto(1) do |i|
  print "#{i} "
end
#=> 10 9 8 7 6 5 4 3 2 1

うん、これなら動く。
で、ここまできてようやくRangeクラスというものの存在を知って「ruby range 逆順」でググったら既に同じような記事がいくつかあった。
その記事によるとRangeクラスにsuccが使われているため、らしい(?)。
つまり昇順(段々大きくなる順序)しかないわけで。

直観的なプログラミングをするとしたら10..1は欲しいと思うんだけどなぁ。