まつもと ゆきひろ@トヨタケーラムです.

チュートリアルの8回目は「制御構造」です.
--
* rubyの制御構造

rubyの制御構造について見てみよう.既に`if'と`while'と`break'
については説明した.それ以外のrubyの制御構造を解説しよう.

まず`if'修飾子と同じように`while'修飾子も存在する.

 ruby> i = 0; print i+=1, "\n" while i < 3
 1
 2
 3
 nil

複数の条件を一度に検査するためには`case'文がある.こんな感じ
で使う.

 ruby> case i
 ruby| when 1, 2..5
 ruby|   print "1..5\n"
 ruby| when 6..10
 ruby|   print "6..10\n"
 ruby| end
 6..10
 nil 

`2..5'は「2から5までの範囲」を表すオブジェクトを返す式である.
この「範囲内かどうか」は

 (2..5) === i

の結果をもとに判断している.つまり,caseは`==='という演算子
を使った比較を一度に行う文ということになる.rubyのオブジェク
ト指向機能でオブジェクトに合わせた処理が選択されるので,数だ
けでなく,いろいろなデータに対して使える.例えば,

 ruby> case 'abcdef'
 ruby| when 'aaa', 'bbb'
 ruby|   print "aaa or bbb\n"
 ruby| when /def/
 ruby|   print "includes /def/\n"
 ruby| end
 includes /def/
 nil 

のように文字列と文字列の比較や,文字列と正規表現との比較にも
使える.

ループから脱出するための制御構造が三つある.`break'と
`continue'はC言語と同じだ.`break'はループの途中から抜け出し,
`continue'はループの次の繰り返しをはじめる.rubyにはもうひと
つ`redo'というものもあり,これはループの現在の繰り返しをもう
一度実行する.C言語が分かる人のためにCで記述するとこうなる.

  label_continue:
  while (condithion) {
    label_redo:
      goto label_continue    /* continue */
      goto label_break       /* break */
      goto label_redo        /* redo */

  }
  label_break:
  ;

脱出といえば`return'がある.これが評価されると関数(メソッド)
から抜ける.引数は戻り値になるが,省略されると`nil'を指定し
たと見なされる.

もうひとつ`for'という繰り返しのための制御構造がある.こんな
感じで使う.

 for i in obj
  ...
 end

for文は複数の要素を持っているobjの各要素を変数iに代入して,
endまでの文を順に実行する.これは後で説明するイテレータの別
形式で,そちらではこういう感じになる.

 obj.each {|i|
  ...
 }

意味は同じなんだけど,なんとなくforの方が一目でなにをやって
いるか分かるような気がするだろう.forはその目的のための文だ.