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'とはC言語 と同じでループの途中から抜け出す.`next'はC言語の`continue' と同じで,ループの次の繰り返しをはじめる.rubyにはもうひとつ `redo'というものもあり,これはループの現在の繰り返しをもう一 度実行する.C言語が分かる人のためにCで記述するとこうなる.
while (condithion) { label_redo: goto label_next /* next */ goto label_break /* break */ goto label_redo /* redo */ ; ; label_next: } label_break: ;
脱出といえば`return'がある.これが評価されると関数(メソッド) から抜ける.引数は戻り値になるが,省略されると`nil'を指定し たと見なされる.
もうひとつ`for'という繰り返しのための制御構造がある.こんな 感じで使う.
for i in obj ... end
for文は複数の要素を持っているobjの各要素を変数iに代入して, endまでの文を順に実行する.これは後で説明するイテレータの別 形式で,そちらではこういう感じになる.
obj.each {|i| ... }
意味は同じなんだけど,なんとなくforの方が一目でなにをやって いるか分かるような気がするだろう.forはその目的のための文だ.