たのしいRuby(第2版) 「はじめてのRuby」〜制御構造 繰り返し2〜


■これは「たのしいRuby 第2版」を元にしています。
http://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC2%E7%89%88-Ruby%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%B0%97%E8%BB%BD%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797336617/ref=pd_sim_b_img_6/250-4677527-6737860


繰り返しのメソッドについて追加です。
前回は、
たのしいRuby(第2版) 「はじめてのRuby」〜制御構造 繰り返し〜 - 基本へ帰ろう
です。

loop

 終了条件がない、ただの繰り返しのためのメソッドもあります。loopメソッドです。


loop {
print "「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」"
}

上記のプログラムを実行すると、
"「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」j"
がコンピュータの資源が許す限り、ずっと出力されることになりますのでやりませんが、
これが、loopというものですね。


繰り返しの制御

 繰り返しの途中で、処理を中断したり、次の回に処理を飛ばしたりしたいことがあります。Rubyには繰り返しやイテレータを制御する3つの命令があります。

break 繰返しを中断し、繰り返しの中から抜ける。
next 次の回の繰り返しに処理を移す。繰り返しの中のnext以降の部分を飛ばして、次の回の処理を開始します。
redo 同じ条件で繰返しをやり直す。redoはnextと似ていますが、もう一度同じ繰返しを実行するところが違います。

breakとnextとredoの違い

具体的にコードを書いてみましょう。

  • プログラム
print "breakの例:\n"
i = 0
["Perl", "Python", "Ruby", "Scheme", "Lips"].each{|lang|
 i += 1
 if i == 3
   break
 end
 p [ i, lang]
}


print "nextの例:\n"
i = 0
["Perl", "Python", "Ruby", "Scheme", "Lips"].each{|lang|
 i += 1
 if i == 3
   next
 end
 p [ i, lang]
}


print "redoの例:\n"
i = 0
["Perl", "Python", "Ruby", "Scheme", "Lips"].each{|lang|
 i += 1
 if i == 3
   redo
 end
 p [ i, lang]
}
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
breakの例:
[1, "Perl"]
[2, "Python"]
nextの例:
[1, "Perl"]
[2, "Python"]
[4, "Scheme"]
[5, "Lips"]
redoの例:
[1, "Perl"]
[2, "Python"]
[4, "Ruby"]
[5, "Scheme"]
[6, "Lips"]

まとめ

 繰り返しの機能そのものだけを考えるとすれば、while文があればどんな繰り返しでも実現できます。極端なことをいえば、ほかの繰り返しの構文やメソッドは必要ないわけです。それにも関らず、繰り返しのための道具がこんなにも揃っているのは、プログラムが単に機能を実現するためのものではなく、書く人にとっても読む人にとっても、わかりやすくすることが大切だから、といえるでしょう。
最初に紹介した各メソッド・構文の一覧に、使いこなすための指針として「主な用途」を追加した表を紹介しておきます。

構文 メソッド 主な用途
times 回数の指定された繰り返しに便利
for eachのシンタックスシュガー
while 条件を自由に指定したい場合
until whileではわかりにくい条件を指定したい場合
each オブジェクトから要素を取り出す場合
loop 回数制限のない繰り返しに便利

環境

C:\enjoy_ruby>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]