【Ruby】case文の書き方と使い方の基本

作成日: 更新日:

開発環境

  • Ruby version: ruby 3.1.2

Rubyのcase文とは

Rubyのcase文とは、コンピュータプログラムで命令が実行される流れを定めた制御構造のうち、条件式の真偽によって処理を分岐させる条件分岐の構文です。 複数の候補から条件分岐させる処理を記述する場合、同じ処理をif文でも記述することができますが、より見やすく簡潔に書くためにcase文を用いた条件分岐で処理を行うほうが望ましい場合があります。 公式リファレンス:https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#case

Rubyのcase文の書き方

Rubyのcase文の書き方を「case文の基本形」「case文の省略形」をご紹介します。

Rubyのcase文の基本形

Rubyのcase文の基本形は下記のように記述します。

1case オブジェクト
2when1 then
3  オブジェクトと式1trueの場合に行う処理
4when2 then
5  オブジェクトと式2trueの場合に行う処理
6when3 then
7  オブジェクトと式3trueの場合に行う処理
8else
9  オブジェクトがどの式にも一致しない場合の処理
10end

比較の対象となるオブジェクトを指定し、オブジェクトがwhenの後に記述された式と一致しているかどうかを演算子「===」を用いて判定し、結果がtrueである時にthen以下の処理を行います。 また、Rubyのcase文のwhenは複数の条件式を並べられるので、breakが用意されていないため、他の言語の違いとして留意する必要があります。 上記と同じ処理をif文で記述した場合は以下となります。

1if オブジェクト ===1 then
2  オブジェクトと式1と一致した場合に行う処理
3elsif オブジェクト ===2 then
4  オブジェクトと式2と一致した場合に行う処理
5elsif オブジェクト ===3 then
6  オブジェクトと式3と一致した場合に行う処理
7else
8  オブジェクトがどの式にも一致しない場合の処理
9end

case文とif文の複数条件の処理を比較するとcase文のほうが簡潔で見やすいかと思います。 caseの戻り値は、if文と同様に「上から順、かつ、左から順」に判定し、最後に判定した式の結果を返しますが、いずれの条件も成り立たなければnilを返します。

Rubyのcase文の省略形

Rubyのcase文の省略形はthenを省略することができます。

1case オブジェクト
2when1
3  オブジェクトと式1trueの場合に行う処理
4when2
5  オブジェクトと式2trueの場合に行う処理
6when3
7  オブジェクトと式3trueの場合に行う処理
8else
9  オブジェクトがどの式にも一致しない場合の処理
10end

実際の開発ではthenを省略して書くことがほとんどなので、省略形で覚えるのがおすすめです。

Rubyのcase文の使い方

Rubyのcase文のよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。

case文のwhenで複数条件を使用したパターン

case文のwhenで式を「,(カンマ)」で区切ることで複数条件を指定することができます。

1month = 10
2
3case month
4when 1,2,12
5  puts "冬"
6when 3,4,5
7  puts "春"
8when 6,7,8
9  puts "夏"
10when 9,10,11
11  puts "秋"
12else
13  puts "季節を特定できません。"
14end

上記と同じ処理をif文で記述した場合は以下となります。

1month = 10
2
3if month === 1 or month === 2 or month === 12
4  puts "冬"
5elsif month === 3 or month === 4 or month === 5
6  puts "春"
7elsif month === 6 or month === 7 or month === 8
8  puts "夏"
9elsif month === 9 or month === 10 or month === 11
10  puts "秋"
11else
12  puts "季節を特定できません。"
13end

case文のwhenで「,(カンマ)」で区切られた式はor条件で判定してくれています。

case文のwhenで範囲オブジェクトを使用したパターン

case文のwhenで式を範囲オブジェクトで指定することができます。

1age = 25
2
3case age
4when 0..19
5  puts "20歳未満のため、購入できません。"
6when 20..nil
7  puts "20歳以上のため、購入できます。"
8else
9  puts "年齢がわかりません。"
10end

whenで範囲オブジェクトのrangeを指定することにより、対象となるオブジェクトが範囲内であればtrueと判定してくれます。 また、「数字..nil」とすることで終端を持たない「数字以上」を扱うことができますが、nilを省略して「数字..」としても挙動は同じになります。

case文のwhenで配列展開を使用したパターン

Rubyのcase文のwhenで式の前に「*」をつけることで配列展開されます。

1prefecture = "鹿児島県"
2
3hokkaido = ["北海道"]
4tohoku = ["青森県","岩手県","宮城県","秋田県","山形県","福島県"]
5kanto = ["茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県"]
6chubu = ["新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県"]
7kansai = ["三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県"]
8chugoku = ["鳥取県","島根県","岡山県","広島県","山口県"]
9shikoku = ["徳島県","香川県","愛媛県","高知県"]
10kyushu = ["福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"]
11
12case prefecture
13when *hokkaido
14  puts "北海道地方"
15when *tohoku
16  puts "東北地方"
17when *kanto
18  puts "関東地方"
19when *chubu
20  puts "中部地方"
21when *kansai
22  puts "関西地方"
23when *chugoku
24  puts "中国地方"
25when *shikoku
26  puts "四国地方"
27when *kyushu
28  puts "九州地方・沖縄地方"
29else
30  puts "都道府県がわかりません。"
31end

配列展開された27行目の「when *kyushu」と鹿児島が一致したことにより、28行目の「puts "九州地方・沖縄地方"」が実行されます。 27行目は配列展開を記述すると「when "福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"」となっています。 そのため、case文のwhenで複数条件を使用したパターンと同様の挙動になります。

case文のwhenで正規表現を使用したパターン

Rubyのcase文のwhenで正規表現を使って判定することもできます。

1case "123-4567"
2when /^[0-9]{3}-[0-9]{4}$/
3  puts "郵便番号は正しいです。"
4else
5  puts "郵便番号は間違っています。"
6end

上記は郵便番号の最初の3桁が数字、間に「-(ハイフン)」、末尾の4桁が数字に一致しているかどうかを判定しています。

おわりに

Rubyのcase文の使い方を解説してきました。 Rubyの条件分岐はif文を使用することが多いかと思いますが、case文と使い分けることでより見やすく簡潔に書くことができますので、是非、参考にしてください。

【Ruby】case文の書き方と使い方の基本 | いっしー@Webエンジニア