教えながら学ぶRuby:イテレータに片思い
2007.10.03
ということでやっと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
(to *mesg)のところカンマが抜けてるのでは。
あとforのところのmsgはmesgでしょうか。
Posted by: mamamoto | 2007.10.03 at 18:14
すばやいご指摘、ありがとうございます。修正しました。
Posted by: satoshi | 2007.10.03 at 18:24
Ruby初心者です。問題2の階乗を求めるプログラムを1行で書いてみました。
「n!(nの階乗)を求めるプログラムを1行で書いてみる。(http://d.hatena.ne.jp/shunsuk/20070918/1190106920)」
Posted by: shunsuk | 2007.10.04 at 03:29