目次
開発環境
- 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文の基本形は下記のように記述します。
1 2 3 4 5 6 7 8 9 10 | case オブジェクト when 式1 then オブジェクトと式1がtrueの場合に行う処理 when 式2 then オブジェクトと式2がtrueの場合に行う処理 when 式3 then オブジェクトと式3がtrueの場合に行う処理 else オブジェクトがどの式にも一致しない場合の処理 end |
比較の対象となるオブジェクトを指定し、オブジェクトがwhenの後に記述された式と一致しているかどうかを演算子「===」を用いて判定し、結果がtrueである時にthen以下の処理を行います。
また、Rubyのcase文のwhenは複数の条件式を並べられるので、breakが用意されていないため、他の言語の違いとして留意する必要があります。
上記と同じ処理をif文で記述した場合は以下となります。
1 2 3 4 5 6 7 8 9 | if オブジェクト === 式1 then オブジェクトと式1と一致した場合に行う処理 elsif オブジェクト === 式2 then オブジェクトと式2と一致した場合に行う処理 elsif オブジェクト === 式3 then オブジェクトと式3と一致した場合に行う処理 else オブジェクトがどの式にも一致しない場合の処理 end |
case文とif文の複数条件の処理を比較するとcase文のほうが簡潔で見やすいかと思います。
caseの戻り値は、if文と同様に「上から順、かつ、左から順」に判定し、最後に判定した式の結果を返しますが、いずれの条件も成り立たなければnilを返します。
Rubyのcase文の省略形
Rubyのcase文の省略形はthenを省略することができます。
1 2 3 4 5 6 7 8 9 10 | case オブジェクト when 式1 オブジェクトと式1がtrueの場合に行う処理 when 式2 オブジェクトと式2がtrueの場合に行う処理 when 式3 オブジェクトと式3がtrueの場合に行う処理 else オブジェクトがどの式にも一致しない場合の処理 end |
実際の開発ではthenを省略して書くことがほとんどなので、省略形で覚えるのがおすすめです。
Rubyのcase文の使い方
Rubyのcase文のよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。
case文のwhenで複数条件を使用したパターン
case文のwhenで式を「,(カンマ)」で区切ることで複数条件を指定することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | month = 10 case month when 1,2,12 puts "冬" when 3,4,5 puts "春" when 6,7,8 puts "夏" when 9,10,11 puts "秋" else puts "季節を特定できません。" end |
上記と同じ処理をif文で記述した場合は以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 | month = 10 if month === 1 or month === 2 or month === 12 puts "冬" elsif month === 3 or month === 4 or month === 5 puts "春" elsif month === 6 or month === 7 or month === 8 puts "夏" elsif month === 9 or month === 10 or month === 11 puts "秋" else puts "季節を特定できません。" end |
case文のwhenで「,(カンマ)」で区切られた式はor条件で判定してくれています。
case文のwhenで範囲オブジェクトを使用したパターン
case文のwhenで式を範囲オブジェクトで指定することができます。
1 2 3 4 5 6 7 8 9 10 | age = 25 case age when 0..19 puts "20歳未満のため、購入できません。" when 20..nil puts "20歳以上のため、購入できます。" else puts "年齢がわかりません。" end |
whenで範囲オブジェクトのrangeを指定することにより、対象となるオブジェクトが範囲内であればtrueと判定してくれます。
また、「数字..nil」とすることで終端を持たない「数字以上」を扱うことができますが、nilを省略して「数字..」としても挙動は同じになります。
case文のwhenで配列展開を使用したパターン
Rubyのcase文のwhenで式の前に「*」をつけることで配列展開されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | prefecture = "鹿児島県" hokkaido = ["北海道"] tohoku = ["青森県","岩手県","宮城県","秋田県","山形県","福島県"] kanto = ["茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県"] chubu = ["新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県"] kansai = ["三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県"] chugoku = ["鳥取県","島根県","岡山県","広島県","山口県"] shikoku = ["徳島県","香川県","愛媛県","高知県"] kyushu = ["福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"] case prefecture when *hokkaido puts "北海道地方" when *tohoku puts "東北地方" when *kanto puts "関東地方" when *chubu puts "中部地方" when *kansai puts "関西地方" when *chugoku puts "中国地方" when *shikoku puts "四国地方" when *kyushu puts "九州地方・沖縄地方" else puts "都道府県がわかりません。" end |
配列展開された27行目の「when *kyushu」と鹿児島が一致したことにより、28行目の「puts "九州地方・沖縄地方"」が実行されます。
27行目は配列展開を記述すると「when "福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"」となっています。
そのため、case文のwhenで複数条件を使用したパターンと同様の挙動になります。
case文のwhenで正規表現を使用したパターン
Rubyのcase文のwhenで正規表現を使って判定することもできます。
1 2 3 4 5 6 | case "123-4567" when /^[0-9]{3}-[0-9]{4}$/ puts "郵便番号は正しいです。" else puts "郵便番号は間違っています。" end |
上記は郵便番号の最初の3桁が数字、間に「-(ハイフン)」、末尾の4桁が数字に一致しているかどうかを判定しています。
おわりに
Rubyのcase文の使い方を解説してきました。
Rubyの条件分岐はif文を使用することが多いかと思いますが、case文と使い分けることでより見やすく簡潔に書くことができますので、是非、参考にしてください。