Rubyには条件文としてif文とcase文があります。
case文はif文同様に条件式によって処理を分岐させるために使用します。
「複数の条件式を簡潔に記述したい」
「case文の使い方を基本から知りたい」
という方に向けてcaseの使い方についてについて以下の内容で解説していきます。
【基礎】case文の基本をまずは理解しよう
【基礎】whenに複数の条件を設定してみよう
【発展】範囲(Range)を指定する
【発展】正規表現(regex)を指定する
【発展】if/elsifとの比較
【発展】caseでbreakは指定できるの?
case文はif文同様処理を分岐するときによく使いますので、使い方をしっかりとマスターしておきましょう!
case文とは
case文は比較する値を指定して、複数の条件式の中から一致した条件に記述されている処理を実行します。
case文の書き方は以下となります。
他の言語のようにSwitch〜caseのような書き方はせず、case〜whenで記載します。
caseに指定した「対象」がwhenに指定した条件のどれかに当てはまる場合、それにあてはまった処理を実行します。
もしどれにも当てはまらない場合は、elseにある処理が実行される流れとなります。
caseの基本的な使い方
以下のサンプルでは指定した値がwhenの条件に一致するか確認し、一致した場合はあてはまったwhenの処理を実行しています。
a = 2 case a when 1 then puts "1st" when 2 then puts "2nd" when 3 then puts "3rd" else puts "any else" end
実行結果
2nd
このプログラムでは、caseに2が格納されたオブジェクトaを指定し、whenの条件で値を1,2,3でそれぞれ指定しています。
aの値は「when 2 then」に当てはまるので、当てはまった条件の処理が実行されます。
以下のように文字列を比較する対象に指定することもできます。
fruits = "orange" case fruits when "apple" then puts "apple" when "orange" then puts "orange" when "melon" then puts "melon" else puts "any else" end
実行結果
orange
このプログラムでは文字列「orange」が格納されたオブジェクトを指定していますので、「when “orange” then」に一致します。
whenに複数の条件を設定してみよう
caseのwhenの条件には、カンマ「,」で区切って複数の条件を書くことができます。
複数書いた条件のいずれかが「対象」とマッチした場合、whenの処理が実行されます。
実際にサンプルコードを見てみましょう。
a = 4 case a when 1, 2, 3 then puts "lower then 4th" when 4, 5 then puts "from 4th to 5th" when 6 then puts "6th" else puts "any else" end
実行結果
from 4th to 5th
以上のように、whenに複数の条件をカンマで区切って並べることができ、並べた条件式のいずれかが「対象」とマッチしたとき、そのwhenの処理が実行されます。
上記コードの場合、aに4が入っているため、when 4, 5 then にマッチし、p “from 4th to 5th”という処理が実行されています。
case文の応用的な使い方
whenには様々な条件を指定することが可能です。
その中でも特に実際の使用頻度が高いものをご紹介します。
範囲(Range)を指定する
たとえば、ショッピングサイトにてユーザの年齢に応じて、オススメする商品をわける処理があるとします。
その際、年齢の幅を範囲で指定するように条件分岐を作成するとします。
そのようなとき、whenに記載する条件は以下のように指定することができます。
a = 25 #年齢 case a when 6..22 then puts "学生生活に必要なオススメ商品" when 23..59 then puts "社会人生活に必要なオススメ商品" when 60..100 then puts "定年後の人生にオススメな商品" else puts "any else" end
実行結果
社会人生活に必要なオススメ商品
“..”は幅を表しており、左の数字から右の数までの範囲を表しています。
そして、対象の年齢に当てはまる幅にて処理が正しく実行されていることが確認できます。
正規表現(regex)を指定する
正規表現もwhenの条件にはよく利用されます。
実際のサンプルコードを確認してみましょう。
a = "SUB-DH003-A" case a when /^A.+/ then puts "Item series A" when /^B.+A$/ then puts "Item series B patch A" when /^SUB.+A$/ then puts "Item series SUB patch A" else puts "any else" end
実行結果
Item series SUB patch A
以上のように、caseのwhenの条件に正規表現を書くことで、正規表現による条件検索が実現できました。
正規表現は慣れない内は理解が難しいかもしれませんが、数をこなすことで強力なプログラミングの武器となります。
正規表現とはそもそも何か不安な方は以下の記事を事前に確認しておくと良いでしょう。
配列(Array)を指定する
配列(Array)はそのまま、whenの条件式には書けません。
では、どうすれば配列をwhenに書けるのでしょうか?
答えは、配列の前にアスタリスク「*」を付けて、配列を展開しwhenに認識させることです。
こちらも具体的なサンプルで確認してみましょう。
a = 4 case a when *[ 1, 2, 3 ] then puts "lower then 4th" when *[ 4, 5 ] then puts "from 4th to 5th" when *[ 6 ] then puts "6th" else puts "any else" end
実行結果
from 4th to 5th
a = 4 ですので、when *[ 4, 5 ] thenのところでマッチし、p “from 4th to 5th” が実行されていますね。
配列は展開されると、カンマ区切りの数値のリストになりますので、上記コードは、実質下記コードと等しくなります。
a = 4 case a when 1, 2, 3 then puts "lower then 4th" when 4, 5 then puts "from 4th to 5th" when 6 then puts "6th" else puts "any else" end
以上のように、caseのwhenに配列をしていする時には、必ず配列を展開して、リスト形式の条件式にするように注意してください。
array(配列)の使い方については以下の記事を参考にしてみてください。
クラス(Class)を指定する
rubyには様々なクラスが存在します。
文字列を扱うStringクラス、数値を扱うNumericクラス、配列を扱うArrayクラスなどがそれにあたります。
そのようなクラスの種類をwhenの条件に指定することで、どのクラスに該当するものかを検索する処理を記述することが可能です。
では、具体的なサンプルコードを確認してみましょう。
a = "おはよう" case a when Numeric then puts "数値です。" when String then puts "文字列です。" when Array then puts "配列です。" when Range then puts "範囲です。" else puts "それ以外です。" end
実行結果
文字列です。
StringやNumericなどクラスの名称をwhenに指定して検索できることが確認できます。
少々特殊な使い方に見えるかもしれませんが、いかにwhenが柔軟な書き方のできるものかというのがよくお分かり頂けたかと思います。
if/elsifとの比較
case文とよく比較される処理としてif/elsif文があります。
処理としてはどちらも複数の条件を扱うものとなりますが、case文の方が比較的見通しの良いコードになりやすいです。
その理由として、if/elsif文の方が処理中に何度も”対象”が出てくる点にあります。
if 条件1 === 対象 then 処理1 elsif 条件2 === 対象 then 処理2 elsif 条件3 === 対象 then 処理3 elsif ・・・ then ・・・ else どの条件にもマッチしない場合に実行する処理 end
上記のサンプル中、”対象”が3箇所でてきます。
case文では1箇所だけでした。
この違いがコードの見通しが良いか悪いかの大きな違いとなります。
そのため、複数の条件を指定する場合、if/elsifではソースコードの可読性が落ちてしまいますので、うまく使い分けるようにしましょう。
if/elsif文含めたif文全体について理解を深めたい場合は、以下の記事が参考になります。
caseでbreakは指定できるの?
C言語など、他の言語ではcase文またはそれと同等のswitch文にて、breakを実行することで、caseのwhenのコードを途中で終了できます。
しかし、rubyのcaseでは、breakは使用できません。
実際のコードを見てみましょう。
サンプルコード:
a = 2 case a when 1 then puts "start" break puts "1st" when 2 then puts "start" break puts "2nd" when 3 then puts "start" break puts "3rd" else puts "start" break puts "any else" end
サンプルコードの実行結果:
C:/localhost/ruby.rb: C:/localhost/ruby.rb:6: Invalid break (SyntaxError) C:/localhost/ruby.rb:10: Invalid break C:/localhost/ruby.rb:14: Invalid break C:/localhost/ruby.rb:18: Invalid break
以上のように、caseのwhenにbreakを使用すると、文法エラー(SyntaxError)が出ていますね。
もともとcaseやswitchのbreakは、一つのwhenの条件をスキップして次のwhenの条件判定に移行するための文でした。
しかし、rubyのcaseのwhenは複数の条件式を並べられるので、breakが用意されていません。
皆さんも気をつけてください。
まとめ
ここではcase文について、
- rubyのcase文の基本
- whenに複数の条件を設定する方法
- 範囲(Range)を指定する方法
- 正規表現(regex)を指定する方法
- if/elsifとの比較
- caseでbreakは指定できるの?
などについて解説しました。
caseの意味することは、ほぼif/elsifと同じです。
if/elsifをcaseでより簡潔に書け、コードの保守性が増すし、機能も豊富ということを覚えられておくと良いでしょう。
また、caseはそれだけでなく、範囲や正規表現、配列、クラスでも、簡潔なコードで簡単に条件分岐できました。
このようにrubyのcaseは覚えておくと非常に強力な武器となります。
また、caseの実行結果を変数に代入することもできました。
caseの実行結果を、case以降のコードに渡す際によく使用しますので、こちらも覚えておいてください。
rubyのcaseの使い方を忘れたら、またこの記事を読み返してみてください。