殻にヒビが...
会社のカルチャー作りの大切さ

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

 ということでやっとRubyの勉強を始めた私だが、「何かを学ぶには人に教えるのが一番」というポリシーの私としては、早速Rubyに関するエントリーを書かずにはいられない。

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

 そう思いながら読み始めた「オブジェクト指向スクリプト言語Ruby(以下「Ruby本」)」。Rubyの生みの親であるまつもとゆきひろ氏自身の手になるものだ。彼なりのイテレータへの思い入れが伝わってくるに違いない...

 ところが、である。

 この本の最初の方に出てくるサンプルがなぜかイテレータを使わずにwhileとforで書かれているのだ。うーん、イテレータに対する私の思いは片思いなのか?と思いながらも、それぞれのサンプルをイテレータを使って書き直して、「こっちの方が美しい」と自己満足に浸っている私である。

 ということで、ここで問題。以下の二つのプログラムをfor/whileを使わずにイテレータで書き直してみていただきたい。私はどちらの例も、イテレータで書いた方がずっと美しいと思うのだが、いかがだろう。

問題1(「Ruby本」ページ42より引用)

def hello(to, *mesg)
 print "Hello, ", to, ".\n"
 print "-- message -- \n"
 for m in mesg
  print m, "\n"
 end
end

問題2(「Ruby本」ページ66より引用)

def fact(n)
 return 1 if n==0
 f=1
 while n>0
  f*=n
  n -= 1
 end
 return f
end

Comments

mamamoto

(to *mesg)のところカンマが抜けてるのでは。
あとforのところのmsgはmesgでしょうか。

satoshi

すばやいご指摘、ありがとうございます。修正しました。

shunsuk

Ruby初心者です。問題2の階乗を求めるプログラムを1行で書いてみました。
「n!(nの階乗)を求めるプログラムを1行で書いてみる。(http://d.hatena.ne.jp/shunsuk/20070918/1190106920)」

The comments to this entry are closed.