【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 オブジェクト 2when 式1 then 3 オブジェクトと式1がtrueの場合に行う処理 4when 式2 then 5 オブジェクトと式2がtrueの場合に行う処理 6when 式3 then 7 オブジェクトと式3がtrueの場合に行う処理 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 オブジェクト 2when 式1 3 オブジェクトと式1がtrueの場合に行う処理 4when 式2 5 オブジェクトと式2がtrueの場合に行う処理 6when 式3 7 オブジェクトと式3がtrueの場合に行う処理 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文と使い分けることでより見やすく簡潔に書くことができますので、是非、参考にしてください。