イテレータラヴ
えぇ、おれもイテレータ好きですよ。
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