Stackoverflowより。
他の言語でいういわゆるswitch文は、Rubyではcase文である。
case a
when 1..5
puts "It's between 1 and 5"
when 6
puts "It's 6"
when String
puts "You passed a string"
else
puts "You gave me #{a} -- I have no idea what to do with that."
end
caseは1つの式に対する一致判定による分岐を行う制御構造だ。
Rubyはまずcaseに渡された式を評価し、その結果を順次whenの式と比較してゆき、一致したwhen節を実行する。 どのwhen節にも一致しなければ、else節が実行される。
この際に比較には===演算子が使用されることがポイントだ。 つまり上記の例では1..5 === a、6 === a、String === aが評価され、これが真になったwhen節が実行される。
case文をif文で書き下すと、以下2つのコードはほぼ等価である。
case 式0
when 式1, 式2
stmt1
when 式3, 式4
stmt2
else
stmt3
end
_tmp = 式0
if 式1 === _tmp or 式2 === _tmp
stmt1
elsif 式3 === _tmp or 式4 === _tmp
stmt2
else
stmt3
end
上でさらっと書いたが、whenには複数の条件を書くことができる。 以下の例ではaが1または2と一致する時に、最初のwhen節が実行される。
case a
when 1, 2
puts "a is 1 or 2"
when 3
puts "a is 3"
else
puts "a is others"
end
さらにあまり見かけないがwhen節では*による配列展開も利用できる。 以下は上記のコードと同じ意味である。
case a
when *[1, 2]
puts "a is 1 or 2"
when 3
puts "a is 3"
else
puts "a is others"
end
参考
