基礎

Rubyのcase文入門|複数条件の分岐をスマートに書く方法

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節のみが実行される