【Ruby】case式とは?実務での使い方と具体例を初心者向けにわかりやすく解説

はじめに

Rubyで条件分岐を行う方法としては、ifelsif を使った基本的な方法がよく知られています。
しかし、複数の条件を見やすく整理するなら case 式が便利だと感じる人もいるのではないでしょうか。

Rubyの case 式は、分岐の条件数が多くなったときにコードを読みやすく整理できるという特徴があります。
また、実務のコードでもよく登場するため、初心者の皆さんが早い段階で理解しておくと役立ちます。

ここでは、ruby case の基本をおさえたうえで、実務の現場でどんなふうに使われるか、その応用例まで紹介していきます。
多くのコード例を交えつつ、ひとつひとつ丁寧に解説していきますので、ご安心ください。

この記事を読むとわかること

  • ruby caseの基本的な書き方
  • if文との違いによるメリット
  • 実務で便利な応用例
  • パターンマッチングとの比較と違い
  • 可読性を高めるためのベストプラクティス

Ruby case式の基本

Rubyの case 式は、ある値をもとに複数の分岐をスマートに書き分けるための構文です。
ひとつの値を軸にして条件をいくつも設定し、それぞれの条件に応じた処理をまとめることができます。

case式とは何か

Rubyにおける case 式とは、以下のような形で書く分岐のための構文です。
同じ変数を複数の条件に対して比較し続ける際、if/elsif で書くよりも可読性が高まりやすいのが特徴でしょう。

case 条件に使うオブジェクト
when1
  # 値1のときの処理
when2
  # 値2のときの処理
else
  # どれにも当てはまらないときの処理
end

case では、指定したオブジェクトが when に続く値と合致した時点で、その分岐のブロックが実行されます。
もし最後まで合致しなかった場合は、else に記述した処理が呼ばれます。

if文との違い

if/elsif でも同じような分岐は実装できますが、case 式を使うと1つの変数(または式)をターゲットにして、それに合致する条件をチェックしやすくなるのがメリットです。
たとえば、複数の if/elsif が続くコードを見たとき、「何を基準に分岐しているか」がわかりにくいことがあります。

一方で case は「メインとなる値」が明示され、その値についてさまざまな条件を when で分割していく形になるため、読みやすさを保ちやすいです。
条件分岐の判定が「同じ対象への比較」である場合には、case 式が役立つでしょう。

基本的な書き方

実際に case 式を記述するときは、下記のようになります。
最初にチェックの対象となる値を置き、when でパターンを並べていきます。

fruit = "apple"

case fruit
when "apple"
  puts "りんごです"
when "banana"
  puts "バナナです"
else
  puts "対象外のフルーツです"
end

ここでは変数 fruit を基準に、"apple""banana" か、それ以外かを判定しています。
実務でもデータや入力値を振り分ける場面で、このような構成をしばしば見かけるのではないでしょうか。

case式を使うメリット

if/elsif と同じく条件分岐のひとつですが、なぜ case を選ぶ人が多いのでしょうか。
ここでは2つの代表的なメリットを紹介します。

可読性の向上

if/elsif で5つ、6つと条件が増えていくと、条件がどこからどこまで続くのか、途中で見落としはないかなど、視認性が悪くなりがちです。
ところが case なら、最初に比較する対象が宣言されているため、「どの値に対してチェックしているか」が一目でわかります。

実務のコードレビューでも、「ここは case のほうがいいんじゃない?」とアドバイスされることがあります。
複数の条件が1つの値に集中しているなら、case 式は良い書き方だといえます。

条件分岐の柔軟性

case 式は、値そのものだけでなく、正規表現や範囲演算子、シンボルなど多彩な判定ができます。
こうした柔軟性は、実務で多様なデータを扱うときに便利でしょう。

たとえば、ユーザーから受け取った文字列が特定のパターンにマッチするかどうかで処理を分けたり、数値がある範囲に含まれるかどうかで分岐を決めたりすることができます。
初心者の段階ではあまり触れないかもしれませんが、知っておくとコードの表現力が広がります。

case式の書き方のバリエーション

Rubyの case 式は基本的な形に加えて、いくつかの書き方の違いやオプションがあります。
慣れてくると、これらのバリエーションを使い分けることでさらに読みやすいコードを書けるでしょう。

シンプルなcase式

最もシンプルなのは、case [変数]when [値]when [値]elseend という形です。
条件が少ないときは、特に難しい工夫をする必要はありません。

color = :blue

case color
when :red
  puts "赤色です"
when :blue
  puts "青色です"
else
  puts "未知の色です"
end

このように、値の比較をベースに「指定された値かどうか」で処理を分ける使い方は、初心者でも理解しやすいでしょう。
とはいえ、実務では単純な文字列やシンボルだけでなく、もう少し複雑な判定を行う場面があります。

thenキーワードの省略可

Rubyの case 式では、when [値] then 処理 と記述して1行でまとめることが可能です。
ですが、可読性を考えると、改行して複数行に分けたほうが見やすいことも多いです。

case color
when :red then puts "赤色です"
when :blue then puts "青色です"
else puts "未知の色です"
end

1行での記述はスッキリしますが、長くなると逆に読みづらいことがあります。
案件やチームのコーディング規約に合わせて選択するといいですね。

多様なwhen節

case は、when 節をいくつでも書くことができます。
条件が多くなればなるほど、if/elsif で書くよりも格段に見通しが良いでしょう。

score = 85

case score
when 0..59
  puts "不合格です"
when 60..69
  puts "合格圏内に近いですが、再試験を検討してください"
when 70..79
  puts "まずまず合格ラインです"
when 80..100
  puts "十分なスコアです"
else
  puts "スコアが不正です"
end

ここでは数値の範囲を利用し、それぞれの範囲に応じてメッセージを変えています。
大規模なプロジェクトであっても、こうした形ならどの範囲にどんな処理がなされるのか確認しやすいでしょう。

case式での値の判定方法

case 式は、内部的には when の値と case の後ろに書いたオブジェクトを == で比較しています。
したがって、オブジェクト同士の比較がどう動くのかを把握しておくと、混乱を防げます。

==の仕組みと注意点

Rubyでは、== はオブジェクトの内容が等しいかどうかを判断するメソッドとして実装されています。
StringInteger などの組み込みクラスでは、期待どおりに動くことがほとんどでしょう。

ただし、カスタムクラスで == を独自に定義している場合などは想定外の結果になることがあります。
そのため、複数の型を混在させて分岐するときは、あらかじめ型を揃えたり、when 側を絞り込んだりしたほうが無難です。

case式での等価判定には「==」が使われています。
異なる型のオブジェクトを比較する場合は、結果に気をつけてください。

正規表現の活用

when では文字列だけでなく正規表現を使うこともできます。
下記のように when /正規表現/ と書くと、case の後ろに指定した文字列が正規表現にマッチするかどうかで判断します。

text = "Hello World"

case text
when /Hello/
  puts "挨拶の言葉を含んでいます"
when /World/
  puts "世界に関するワードを含んでいます"
else
  puts "どちらの単語もありません"
end

この例では「Hello」という単語が含まれる場合に最初のブロックが実行されます。
複数のパターンを一度に判定する際に非常に便利ですね。

実務で役立つ応用例

ここからは case 式が実務でどう活用されるか、具体的な例をいくつか見ていきましょう。
わかりやすい事例を中心に紹介しますが、実際にはもっと複雑なロジックになることも多いです。

エラーハンドリングでの活用

APIレスポンスや外部サービスからのエラーコードに応じて、処理を分けるシーンはよくあります。
そのとき case 式でコードをわかりやすく振り分けられると便利です。

error_code = 404

case error_code
when 400
  puts "リクエストが不正です"
when 401
  puts "認証が必要です"
when 403
  puts "アクセスが禁止されています"
when 404
  puts "ページが見つかりません"
else
  puts "その他のエラーが発生しています"
end

このようにHTTPステータスコードを元に適切なエラーメッセージを表示したり、リトライ処理を行ったりできます。
実際の現場では、ここにログ出力や再送処理などのロジックが入ることもあります。

ステータスコードの振り分け

社内で使うツールなどで、ユーザーのステータスを activeinactive などで管理し、それに応じて処理を分けるケースがあります。
このような複数ステータスのとき、if/elsif よりも case が直感的かもしれません。

status = :active

case status
when :active
  puts "ユーザーはアクティブです"
when :inactive
  puts "ユーザーは非アクティブです"
when :banned
  puts "ユーザーは利用停止中です"
else
  puts "不明なステータスです"
end

チーム開発では、ステータスの増減が発生しても、case であれば when :xxx を追加するだけで対応しやすいですね。
可読性と拡張性のバランスがとりやすいといえます。

CLIアプリケーションにおける操作分岐

Rubyで簡単なCLIアプリケーションを作る場合、ユーザーが入力したコマンド文字列によって分岐させることがあります。
このとき case を使うとスッキリ整理できます。

command = "list"

case command
when "list"
  puts "アイテム一覧を表示します"
when "show"
  puts "特定のアイテムの詳細を表示します"
when "exit"
  puts "アプリケーションを終了します"
else
  puts "サポートされていないコマンドです"
end

ここでは単純にコマンドを文字列で判定しています。
ファイル操作やデータベースとの連携など、実際の場面では処理内容がもっと複雑になるかもしれませんが、要点は同じです。

パターンマッチングとの違い

Rubyには最近、パターンマッチングという機能も注目されています。
case と似たような雰囲気がありますが、実は仕組みや使い所に少し違いがあります。

ざっくりとした違い

case は単純に「特定のオブジェクトと when の値を比較する」構文です。
一方、パターンマッチングは、オブジェクトの構造を分解して変数に代入したり、クラスごとに分岐したりできる点が特徴的でしょう。

パターンマッチングのほうがオブジェクト内部の要素分解に向いており、case はあくまで値の一致をベースに判定する形です。
実務でも、単純に値を比較するだけなら case で十分な場面は多いです。

case式におけるパターンマッチ

Rubyのバージョンによっては case とパターンマッチングを組み合わせる構文が利用できます。
しかし、まだ比較的新しい機能であり、チームや使用しているRubyのバージョン状況によっては導入が難しい場合もあります。

case 式をしっかり使いこなしたうえで、より高度なマッチングを要する場面になったらパターンマッチングを検討する、という流れが良いかもしれませんね。
まずは case 式の基本的な使い方をきちんとマスターしておけばOKです。

case式を使うときのベストプラクティス

Rubyの case 式は多くの場面で便利ですが、使い方によってはかえって読みづらくなることもあります。
ここでは、実務でよく言われるベストプラクティスをいくつかまとめます。

コードの可読性を高める

まず重要なのは、必要以上に when 節を増やしすぎないことです。
分岐があまりにも多いと、それこそ数十行もの case 式になってしまい、どこが何を判定しているのか追いづらくなるかもしれません。

その場合は、分岐をメソッドに切り出したり、別の設計パターン(たとえばテーブル駆動)を検討するのも手でしょう。
複雑さを軽減するために、適度にメソッド分割することを心がけたいですね。

無駄のない分岐設定

case 式を使うときは、else まで含めて「すべての可能性をカバーできるか」を意識することが大切です。
意図しない値が渡ってきた場合のデフォルト動作をどうするのか明確に決めるだけで、バグやエラーを回避しやすくなります。

一方で、逆に使わないケースがない when 節があれば、単にコードが冗長になる原因になるため削除を検討しましょう。
実務ではメンテナンス性と拡張性のバランスが大事です。

case式の範囲指定

Rubyでは、範囲演算子 .....when に使うことが可能です。
先ほどの例でも少し紹介しましたが、数値や文字列の範囲を指定したいときに大いに役立ちます。

when x..y の活用

例えば、年齢によって処理を分けたい場合、以下のように書くととてもスッキリします。

age = 25

case age
when 0..17
  puts "未成年"
when 18..64
  puts "成人"
when 65..150
  puts "高齢者"
else
  puts "入力された年齢が範囲外です"
end

このように、ある一定の範囲に属するかどうかで分岐する場面は実際の開発でも少なくありません。
case 式と範囲指定を組み合わせることで、条件が分かりやすいコードを書けるでしょう。

case式のシンボル活用

Rubyではキーワードをシンボル(:symbol)で表現することが多いですが、それらを case 式の中で活用すると、さらに読みやすいコードになる場合があります。

シンボルを使った分岐

たとえばユーザーの役割をシンボルで管理している場合、以下のように書くとスッキリします。

role = :manager

case role
when :admin
  puts "管理者向けの機能をすべて利用できます"
when :manager
  puts "スタッフの管理が可能です"
when :user
  puts "一般利用者向けの機能のみ利用できます"
else
  puts "定義されていない役割です"
end

文字列よりもシンボルのほうがタイプミスなどに早く気づきやすく、メモリ効率も考慮されているため、実務でよく使われる選択肢といえます。
複数のロールを扱う際にも便利でしょう。

case式の戻り値と変数への代入

Rubyの case は「式」なので、戻り値として扱うことができます。
これは初心者の方があまり意識していないかもしれませんが、実務ではときどき役立ちます。

式としての利用方法

case 式の最後に評価された値がそのまま戻り値になります。
そのため、分岐によって異なる文字列を返したいときなど、下記のように書くとスッキリするでしょう。

status_message = case status
when :active
  "ユーザーはアクティブです"
when :inactive
  "ユーザーは非アクティブです"
else
  "不明なステータスです"
end

puts status_message

このように変数に代入すれば、出力や他のメソッド呼び出しに使う際も簡潔です。
複数の条件のうちどれかを結果として返すようなロジックでよく使われます。

case式が使えないケースと対処

case 式は便利ですが、すべての場面で使えるわけではありません。
むしろ、無理して case を使うと可読性が落ちてしまうケースも存在します。

単純すぎる条件のとき

条件が1つか2つしかない場合は、if/else で書いたほうが短くなります。
case 式を使う意味があまりないので、余計に冗長だと感じられてしまう可能性があるでしょう。

実務でも、「わざわざ case を書かなくても if/else で十分だよね」というコードがあれば、そちらのほうが読みやすいことが多いです。
コードはシンプルさを維持するのが肝心ですね。

多すぎる分岐のとき

逆に、あまりにも分岐が多い場合は、case 式だけで管理するのは厳しくなります。
データをハッシュにまとめたり、テーブル駆動(条件と結果を配列やハッシュで管理)する方法を検討したほうが、保守しやすくなることも多いです。

数十個もの when が並ぶようなケースは、かえって変更ミスや確認漏れが起きやすいでしょう。
その場合は設計や実装を見直して、より適切な方法を採用すると安心です。

適切なツールを使うことが大事です。
case式だけでなく、if文やテーブル駆動など他の方法も状況に応じて検討しましょう。

まとめ

ここまで ruby case について、基本文法や実務での活用シーン、そしてベストプラクティスなどを解説してきました。
条件分岐はプログラミングで欠かせない要素ですが、その書き方を工夫するだけでコードの見た目や保守性が大きく変わります。

case 式は多くの場面で役立ち、初心者の方でも理解しやすい構文です。
いろいろな場面で使える柔軟さと読みやすさを兼ね備えているので、複雑な条件分岐をまとめる際にはぜひ活用してみてください。

もし条件が少ない場合は if/else を使い、逆に条件が多すぎるときは別の方法を選ぶなど、状況によって使い分けることも大切です。
最終的にはチームのコーディング規約や、可読性をどのように保つかという観点で決めるとスムーズですね。

プログラミング初心者の皆さんも、まずはシンプルなサンプルコードで case 式を試しながら、理解を深めてみるといいのではないでしょうか。
日常的な開発の中でだんだんと使いこなし、より複雑なロジックにも対応できるようになれば、実務での活躍の幅が広がるはずです。

Rubyをマスターしよう

この記事で学んだRubyの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。