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

■これは「たのしい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

概要

 同じこと、または同じようなことを何度か繰り返したい場合があります。繰返しを行う方法を3つ紹介しましょう。

やってみるのは、

  • while
  • times
  • each

の3つです。


while文

 while文は、繰り返しを行うための基本的な構文です。なお、doは省略することもできます。

while 繰り返し続ける条件 do
 繰り返したい処理
end

ふむ。やってみましょう。

  • プログラム
i = 1
while i <= 10
 p i
 i = i + 1
end
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
1
2
3
4
5
6
7
8
9
10

変数 i が 10以上になるまで繰り返しましたね。
whileは無限ループに注意です。繰り返し続ける条件がずっと満たされているとずーーーーっと繰り返していますから。

「条件を満たすまで繰り返す」ということですから、
「クイズが正解するまで繰り返す」とか
「西暦2100年まで繰り返す」とか
「何か成功するまで繰り返す」とか
いろいろと使えますね。


until文

if文に対してunless文があったように、while文に対してもuntil文があります。until文は、構文の見た目はwhile文と同じですが、条件の判定が逆になります。つまり、その条件を満たしていない場合に繰返しを行います。


until 条件 do
 繰り返したい処理
end

なるほどー。とりあえずやってみましょう。

  • プログラム
i = 1
until 10 <= i
p i
i = i + 1
end
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
1
2
3
4
5
6
7
8
9

おおぉ、なりましたね。

timesメソッド

回数が決まっているときは、「times」というメソッドを使うと簡単です。

繰り返す回数.times {
 繰り返したい処理
}

ふむ。やってみましょう。

  • プログラム
100.times {
 print "「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」\n"
}
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」

「う…うろたえるんじゃあないッ! ドイツ軍人はうろたえないッ!」
↑これが100回も繰り返されているページをはじめてみましたwww
なかなか貴重ではないかと思われます。

 timesメソッドいテレーたと呼ばれるメソッドです。イテレータiterator)は、他の言語ではあまり見られないRubyの特徴的な要素です。
スペルからも分かるように「繰り返す(iterate)もの(-or)」という意味です。オペレータ(operator)が「演算(operate)するもの」として「演算子」と呼ばれるものをまねするなら、さしずめ「繰り返し子」「反復子」というところでしょうか。
 その名の通り、繰返しを行うためのメソッドです。
 Rubyはtimesメソッド以外にも数多くのイテレータを提供しています。イテレータの代表はeachメソッドです。eachメソッドについては、第2章で配列やハッシュと一緒に紹介します。

まぁ、せっかくなのでeachも少し触ってみましょう。

each

このメソッドは「順番に要素を取り出し、その要素を使って何らかの処理をする」ためのイテレータで、Rubyのいろいろなクラスで定義されています。
- たのしいRuby P379

プログラミング言語 Ruby リファレンスマニュアル

各要素に対してブロックを評価します。self を返します。

例:
#1、2、3が順番に表示される
[1,2,3].each do |i|
p i
end

まだ、配列などをやっていないので分かりにくいですよね・・・。
とりあえず、配列に定義されているeachの実行結果をみてみましょう。

  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
1
2
3

ふむ。順番に出力されましたね。
詳しくは後日行います。



環境

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