case文で複数の条件分岐を簡潔に書こう
学習の目標
本章では、以下の内容を学習します。
- case文の基本的な構造と使い方を理解する
- case文とif文の違いと使い分けを学ぶ
- 複数条件を一度に指定する方法を習得する
- 範囲指定を使った数値の条件分岐を学ぶ
- thenを使った簡潔な記法を習得する
はじめに
前回の章では、if文とその派生形である三項演算子について学びました。条件分岐には様々な書き方がありますが、今回は「ある値が複数の候補のどれに一致するか」を判定する際に便利なcase文についてご紹介します。
例えば、選択肢から選んだメニュー番号によって処理を変えたり、成績に応じてメッセージを表示したりするとき、if文でも書けますが、case文を使うとコードがすっきりと読みやすくなります。
それでは、実際のコード例を見ながら、case文の使い方を一緒に学んでいきましょう。
case文の基本
基本的な書き方
まずは、case文の基本的な書き方を見てみましょう。成績によって異なるメッセージを表示する簡単な例を作ってみます。
case.rbというファイルを作成し、以下のコードを書いてみましょう。
score = "A"
case scorewhen "A"  puts "大変よくできました"when "B"  puts "よくできました"when "C"  puts "がんばりましょう"else  puts "評価がありません"endこのプログラムは、変数scoreの値に応じて異なるメッセージを表示します。scoreの値が"A"であれば「大変よくできました」、"B"であれば「よくできました」といった具合です。
case文の基本的な構造は以下のとおりです。
- caseキーワードの後に、比較したい値(この例では- score)を書きます
- whenの後に、条件となる値を書きます
- whenの値と一致した場合に実行する処理を書きます
- どの条件にも当てはまらなかった場合の処理をelseの後に書きます
- 最後にendで終わります
試しにscore = "B"に変更してプログラムを実行してみると、「よくできました」と表示されるでしょう。このように、値によって処理を変えることが簡単にできます。
case文とif文の比較
同じ条件分岐をif文で書くとどうなるでしょうか。
書き直してみると、以下のようになります。
score = "A"
if score == "A"  puts "大変よくできました"elsif score == "B"  puts "よくできました"elsif score == "C"  puts "がんばりましょう"else  puts "評価がありません"endどちらも同じ処理をしますが、case文を使うと、比較する変数(score)を一度だけ書けばよいため、コードが簡潔になります。特に条件分岐が多い場合は、case文の方が読みやすくなることが多いです。
whenとthenを使った簡潔な記法
case文を使うとき、処理が1行で済む場合は、thenキーワードを使ってさらに簡潔に書くことができます。
score = "A"
case scorewhen "A" then puts "大変よくできました"when "B" then puts "よくできました"when "C" then puts "がんばりましょう"else puts "評価がありません"endこのように書くと、whenのあとにthenを置き、その後に実行したい処理を1行で書くことができます。コードがよりコンパクトになりますね。
ただし、処理が複数行になる場合や、複雑な処理を行う場合は、通常の書き方(thenを使わない方法)の方が読みやすくなることもあります。その場合は無理にthenを使う必要はありません。プログラミングでは、コードの「読みやすさ」も大切な要素です。
複数の条件を一度に指定する
実際のプログラミングでは、複数の値のいずれかに一致する場合に同じ処理を行いたいことがよくあります。case文では、whenの後にカンマで区切って複数の値を指定することができます。
月によって季節を判定するプログラムを例に見てみましょう。
month = 7
case monthwhen 3, 4, 5  puts "春です"when 6, 7, 8  puts "夏です"when 9, 10, 11  puts "秋です"when 12, 1, 2  puts "冬です"else  puts "正しい月を入力してください"endこのプログラムでは、3月、4月、5月のいずれかであれば「春です」、6月、7月、8月のいずれかであれば「夏です」というように判定しています。変数monthの値が7なので、「夏です」と表示されます。
このように、カンマを使って複数の値を指定すると、それぞれの値に対して==で比較した結果の「OR条件」として扱われます。if文で書くならif month == 3 || month == 4 || month == 5のような書き方に相当します。
複数の条件を書きたい場合、case文を使う方がコードがすっきりして読みやすくなることが多いです。
範囲を使った条件分岐
数値を扱う場合、特定の範囲内にあるかどうかを判定したいことがよくあります。例えば、テストの点数によって成績を判定するようなケースです。
case文では、範囲演算子(..や...)を使って数値の範囲を指定することができます。
score = 85
case scorewhen 90..100  puts "S評価です"when 80...90  puts "A評価です"when 70...80  puts "B評価です"when 60...70  puts "C評価です"else  puts "D評価です"endこの例では、変数scoreの値が85なので「A評価です」と表示されます。
ここで使われている範囲演算子には2種類あります。
- ..(ドット2つ)は両端を含む範囲を表します。例えば- 90..100は「90以上100以下」という意味です。
- ...(ドット3つ)は左端を含み、右端を含まない範囲を表します。例えば- 80...90は「80以上90未満」という意味です。
テストの点数のように、境界値が重要な場合には、このような範囲指定が非常に便利です。例えば80点が「B評価」なのか「A評価」なのかを明確にできます。
if文でも同様の処理は書けますが、case文を使った方がコードが簡潔になり、各範囲の境界がわかりやすくなります。
実用的な例: 曜日による予定表示
case文は実際のプログラムでもよく使われます。例えば、曜日によって異なる予定を表示するプログラムを考えてみましょう。
today = "水曜日"
case todaywhen "月曜日"  puts "朝会があります"  puts "週報を提出してください"when "水曜日"  puts "部内会議があります"  puts "プロジェクト進捗を報告してください"when "金曜日"  puts "週末レポートを準備してください"when "土曜日", "日曜日"  puts "休日です"else  puts "特別な予定はありません"endこのプログラムでは、変数todayの値が"水曜日"なので、「部内会議があります」と「プロジェクト進捗を報告してください」の2行が表示されます。
この例では、一つのwhenに対して複数行の処理を書いています。このように、条件に応じて複数の処理を実行したい場合も、case文で簡潔に表現できます。
case文の応用: 正規表現を使った条件分岐
Rubyのcase文は、等価演算子(==)だけでなく、===演算子を使って比較を行います。これにより、文字列や数値の一致だけでなく、より複雑なパターンマッチングも可能になります。
例えば、正規表現を使って文字列のパターンを判定することもできます。
email = "user@example.com"
case emailwhen /^admin@/  puts "管理者用メールアドレスです"when /^info@/  puts "情報用メールアドレスです"when /^support@/  puts "サポート用メールアドレスです"else  puts "一般的なメールアドレスです"endこの例では、メールアドレスがadmin@で始まるかどうか、info@で始まるかどうかなどをパターンマッチングで判定しています。正規表現の詳細については後のレッスンで学びますが、case文ではこのような高度な条件判定も簡潔に書けることを覚えておくと便利です。
実用的なテクニック: caseに値を指定しない方法
case文には、もう一つ便利な使い方があります。caseの後に値を指定せず、whenの後に直接条件式を書く方法です。この場合、各whenの条件式がtrueになるかどうかで分岐します。
age = 25status = "学生"
casewhen age < 18  puts "未成年です"when age >= 18 && age < 20  puts "成人ですが、お酒は飲めません"when age >= 20 && status == "学生"  puts "成人の学生です"when age >= 20  puts "成人です"endこの例では、値を指定せず、各when節に条件式を直接書いています。この書き方はif-elsif-else文に似ていますが、複数の条件を一覧できる形になるので、条件が多い場合は読みやすくなることがあります。
このように、case文は様々な書き方ができ、状況に応じて最適な使い方を選べるのも魅力の一つです。
if文とcase文の使い分け
さて、条件分岐にはif文もcase文も使えることがわかりました。では、どのような場合にどちらを選べばよいのでしょうか?
一般的には、以下のような基準で使い分けるとよいでしょう。
if文が適している場面
- 条件が複雑な場合(複数の変数を組み合わせた条件)
- 条件の数が少ない場合(2〜3個程度)
- 真偽値(true/false)を直接判定する場合
- 条件ごとに比較対象が異なる場合
case文が適している場面
- 一つの変数の値によって多くの分岐がある場合
- 値が複数の候補のどれかに一致するかを判定する場合
- 数値の範囲で分岐する場合
- パターンマッチングを行いたい場合
どちらを使っても同じ処理は書けますので、読みやすさや保守性を考慮して選ぶとよいでしょう。また、チームで開発している場合は、チームの規約に従うことも大切です。
まとめ
この章では、case文について学びました。以下の内容をマスターできたことと思います。
- case文の基本的な構造と書き方
- when節での複数条件の指定方法
- 範囲演算子を使った数値の範囲指定
- thenを使った簡潔な記法
- case文とif文の使い分け
case文は、if文と同様に条件分岐を行うための基本的な制御構造です。特定の値に基づいて処理を分岐させたい場合には、case文を使うとコードが簡潔になり、読みやすくなることが多いです。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。