Rubyにはある変数の値によって処理を分岐させる case 文があります。case 文は C言語や Java言語にある Switch 文と似た構造をもちます。
case 文の使い方
case 文の記述方法は以下の通りです。
1 2 3 4 5 6 7 8 |
case 比較対象となる値 when 値1 # オブジェクトが値1と一致したときに実行する処理 when 値2 # オブジェクトが値2と一致したときに実行する処理 else # どの when節の値とも一致しないときに実行する処理 end |
case 節には比較対象となる文字列や、数値などを指定します。また、when 節には case 節の値と比較する値を指定します。when節はいくつでも記述することができます。when節の値は === 演算子で比較されます。
以下は case節に文字列を指定した場合の例です。
1 2 3 4 5 6 7 8 9 10 11 |
color = "yellow" case color when "green" puts 1 when "yellow" puts 2 when "red" puts 3 else puts 0 end # 2 |
上の例では、変数 color の値が "green" なら 1 を出力し、 "yellow" なら2、"red" なら 3 を出力します。変数 color がそれ以外の値なら 0 が出力されます。この場合、2番目の when 節の値と一致するので、実行すると 2 が表示されます。
case 文には break 文を記述する必要はありません。たとえ複数の when 節の値と一致したとしても最初に一致した when 節の処理しか実行されないので、注意してください。
case 文は最後に評価された式の値を返すので、変数に代入することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
color = "yellow" value = case color when "green" 1 when "yellow" 2 when "red" 3 else 0 end puts value # 2 |
上の例では case の戻り値を value に代入しています。
例では変数 color は "yellow" なので、 実行結果のように 2 が出力されます。もし上の例の case 文を if 文で記述した場合は以下のようになります。
1 2 3 4 5 6 7 8 9 10 |
color = "yellow" if color === "green" puts 1 elsif color === "yellow" puts 2 elsif color === "red" puts 3 else puts 0 end |
結果は case を使用したときの例と同じになりますが、if, elsif 節に与える条件式に変数を何度 color を何度も指定しなくてはならず、case 文で記述したときより記述量が増えてしまいます。
when 節に複数の条件を指定する
when の値には( , )カンマで区切って複数の条件を書くことができます。「when 0, 1」と記述すると0または1の場合を意味します。
1 2 3 4 5 6 7 8 9 10 11 |
color = "orange" case color when "green", "blue" puts 1 when "yellow", "orange" puts 2 when "red" puts 3 else puts 0 end # 2 |
上の例では変数 color は2番目の when 節の "orange" と一致するので、 実行すると 2 が表示されます。
when 節に範囲を指定する
when 節にはRangeオブジェクトで範囲を指定することができます。
1 2 3 4 5 6 7 8 9 |
score = 65 case score when 0..59 puts "C" when 60..79 puts "B" else puts "A" end # B |
上の例では、変数 score は65なので、2番目の when 節の 60〜79 の範囲内なので B が出力されます。
when 節にクラスを指定する
when 節にはクラスを指定することができます。
1 2 3 4 5 6 7 8 9 10 11 |
value = 1.4 case value when Integer puts "int" when Float puts "float" when String puts "string" else puts "type error." end # float |
上の例では、 変数 value に 1.4 というFloatクラスの値が格納されており、2番目の Float クラスと一致するので、 float と出力されます。与えられた変数の所属するクラスによって条件分岐することができるので、より汎用性の高い機能を実装することができます。
when 節に正規表現を指定する
when 節には正規表現(Regexp オブジェク ト)を指定することができます。
1 2 3 4 5 6 7 8 9 |
lang = "Haskell" case lang when /as/ puts "AS" when /on/ puts "ON" else puts "NOTHING!" end # AS |
上の例では、変数 value に "Haskell" という文字列が格納されており、 "Haskell" という文字列には "as" という文字列が含まれているので実行すると AS が表示されます。