イテレータラヴ

えぇ、おれもイテレータ好きですよ。

Rubyという言語に関しては色々な意見があるとは思うが、私が(いまのところ)一番気に入っているのはイテレータという考え方。これは美しい。できることならば、forとかwhileのない言語にしてくれればもっと美しかったのにと思うぐらいだ。

Life is beautiful: 教えながら学ぶRuby:イテレータに片思い

問題やってみた。


問題1

def hello(to, *mesg)
  print "Hello, ", to, ".\n"
  print "-- message -- \n"
  mesg.each do |m|
    print m, "\n"
  end
end

問題2

def fact(n)
  return 1 if n==0
  f=1
  (2..n).each do |i|
    f *= i
  end
  return f
end

うん、まぁまぁ美しい。

Rubyでプログラミングしていて、for, whileを使うことはほとんどない。イテレータを使うとコードが実に美しくなる(と感じている)からである。

ところが、海外のRubyプログラマはfor, whileをよく使う傾向があるっぽい。例えばRuby on Railsソースコードを読んでいると、よくforが登場する。美意識の違いかね?

もっとも、俺は名前通りの"繰り返しの抽象化"としてのイテレータよりも、"ブロック付きメソッド"としての使い方がおおいに気に入っている。

たとえば、こんなことすると、処理終了後に勝手にファイル閉じてくれるとか。

open("foo.txt") { |file|
  file.each { |line|
    puts "#{$.}: #{line}"
  }
}

また、Rakeに見られるように、内部DSLとの親和性を高めることにもイテレータが一役買っている。下記のnamespaceもfileもメソッドなのだが、ブロックを渡せるおかげで、まるで言語にそういう構文が定義されているかのように見える。

namespace :build do
  file "hoge.exe" => OBJS do |t|
    sh "#{CC} #{CFLAGS} -o #{t.name} #{t.prerequisites.join(' ')}"
  end
end

つまり、イテレータすげぇ、イテレータ最高!ってことだ。俺がRubyに転んでしまったのもやむなしだな!