case文は1つの値に対して複数の条件を比較する際に使う制御構文です。if-elsif文を何段も重ねるよりも、case文を使った方がコードが簡潔で読みやすくなります。Rubyのcase文は他の言語のswitch文に相当しますが、より柔軟で強力な機能を持っています。
基本的な使い方
case文はcaseの後に比較対象の値を指定し、whenで各条件を記述します。
Ruby
day = '月曜日'
case day
when '月曜日'
puts '週の始まりです。頑張りましょう!'
when '水曜日'
puts '折り返し地点です'
when '金曜日'
puts 'もうすぐ週末です!'
when '土曜日', '日曜日'
puts '休日です。ゆっくり休みましょう'
else
puts '通常の営業日です'
end実行結果
週の始まりです。頑張りましょう!whenの後に比較する値を書き、マッチした場合にそのブロックが実行されます。when '土曜日', '日曜日'のようにカンマで区切ることで、複数の値を1つのwhenで扱えます。どのwhenにもマッチしない場合はelseのブロックが実行されます。
case文の戻り値
Rubyのcase文は値を返すため、変数に直接代入できます。
Ruby
status_code = 404
message = case status_code
when 200
'成功'
when 301
'リダイレクト'
when 404
'ページが見つかりません'
when 500
'サーバーエラー'
else
'不明なステータス'
end
puts "ステータス: #{status_code} - #{message}"実行結果
ステータス: 404 - ページが見つかりません範囲を使ったcase文
Rubyのcase文では範囲オブジェクト(Range)をwhenの条件に使えます。成績判定のような範囲比較に最適です。
Ruby
score = 82
grade = case score
when 90..100
'A(優秀)'
when 80..89
'B(良好)'
when 70..79
'C(普通)'
when 60..69
'D(可)'
else
'F(不可)'
end
puts "点数: #{score} → 評価: #{grade}"実行結果
点数: 82 → 評価: B(良好)正規表現を使ったcase文
正規表現もwhenの条件に使えるため、文字列のパターンマッチングに活用できます。
Ruby
email = 'user@example.com'
result = case email
when /\A[\w.]+@gmail\.com\z/
'Gmailアドレスです'
when /\A[\w.]+@yahoo\.co\.jp\z/
'Yahooアドレスです'
when /\A[\w.]+@.+\z/
'有効なメールアドレスです'
else
'無効な形式です'
end
puts result実行結果
有効なメールアドレスです実践的な使い方
Ruby
# 料金計算システム
def calculate_fare(age)
fare = case age
when 0..5
0
when 6..11
500
when 12..64
1000
when 65..Float::INFINITY
700
end
category = case age
when 0..5 then '幼児'
when 6..11 then '子供'
when 12..64 then '大人'
else 'シニア'
end
puts "年齢: #{age}歳 / 区分: #{category} / 料金: #{fare}円"
end
calculate_fare(3)
calculate_fare(8)
calculate_fare(30)
calculate_fare(70)実行結果
年齢: 3歳 / 区分: 幼児 / 料金: 0円
年齢: 8歳 / 区分: 子供 / 料金: 500円
年齢: 30歳 / 区分: 大人 / 料金: 1000円
年齢: 70歳 / 区分: シニア / 料金: 700円case文の内部動作
case文のwhenは内部的に===演算子(トリプルイコール)を使って比較しています。これにより、値の一致だけでなく、範囲チェック、正規表現マッチ、クラス判定などもwhenで使えます。
breakは不要
RubyのCase文では、C言語やJavaのswitch文とは異なりbreakは不要です。マッチしたwhen節の処理が終わると自動的にcase文を抜けます。フォールスルー(次のwhenも実行される)は起きません。
まとめ
case-whenで複数の条件分岐を簡潔に書けるwhenにはカンマ区切りで複数の値を指定できる- 範囲(Range)や正規表現もwhenの条件に使える
- case文は値を返すため、変数に直接代入できる
- breakは不要で、マッチしたwhen節のみが実行される