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

教えながら学ぶ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)」

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)