たのしい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]