C言語やJavaでの「switch」文は、Rubyでは「case」文を用います。「case」文は、複数の候補の中から一致するものを探すようなシーンで便利で、他の言語を触ったことがある人であれば、基本的には「switch」文と同じものと捉えて問題ないでしょう。
この記事では、Rubyの「case」文の使い方を解説します。
case文の基本
Rubyの条件式には「case」文の他にも「if」文があります。「if」文ではAND/OR条件や、複数の条件式を組み合わせて複雑な分岐を行うことが可能ですが、一つの値に対して複数の候補の中で一致するものを探すような場合には「case」文を使用すると便利でスマートなコードになります。
Rubyの「case」文は、C言語や Java言語で使える「switch」文と似た構文をもちます。
「case」文の構文は次の通りです。
case 比較対象とする変数など
when 値1 then
#値1と一致した時に実行される処理
when 値2 then
#値2と一致した時に実行される処理
else
#いずれの値に一致しない時に実行されるとき
end
このように「case」文は、比較対象とする変数の値の候補をwhen <値>で1つ以上指定していき、比較対象の変数と一致するwhen <値>があると、その下のコードブロックが実行されまます。
when <値>で指定された候補の値のいずれにも一致しない場合は、elseで指定したコードブロックが実行されます。
Rubyの「case」文は、thenキーワードを省略して次のように書くこともできます。
case 比較対象とする変数など
when 値1
#値1と一致した時に実行される処理
when 値2
#値2と一致した時に実行される処理
else
#いずれの値に一致しない時に実行されるとき
end
case文を使ってみる
「case」文の構文を確認したところで、色々なサンプルコードを確認しならが「case」文の使い方を理解していきましょう。
以下は、文字列の変数を「case」に指定し、各when式で条件に一致する言語名を出力するサンプルコードです。
lang = "ja"
case lang
when "en"
puts "英語"
when "ja"
puts "日本語"
else
puts "それ以外の言語"
end
実行結果
-------------------
日本語
数値の範囲を指定
数値の範囲や、ある値以上・以下の条件を「case」文で指定します。値の範囲を条件に指定する時はwhen 開始…終了のように範囲オブジェクトて指定します。
value = 9
case value
when 0..10
puts "値は0-10の範囲内です"
else
puts "範囲外です"
end
実行結果
-------------------
値は0-10の範囲内です
開始や終了の値にnilを指定すると、以上・以下の条件を指定できます。
value = 20
case value
when nil..10
puts "valueは10以下です"
when 11..nil
puts "valueは11以上です"
end
実行結果
-------------------
valueは11以上です
カンマ区切りで複数の値を条件に指定
when節で指定する値は、カンマで区切って複数指定できます。
value = "ruby"case valuewhen "php", "ruby", "python" puts "指定したプログラミング言語は、スクリプト言語です"when "java", "c", "c#" puts "指定したプログラミング言語は、コンパイル言語です"end
実行結果-------------------指定したプログラミング言語は、スクリプト言語です
変数の型で分岐する
case文は値だけでなく、型でも分岐させることができます。
変数の型が不明な時に、型に応じで処理を振り分けるような汎用的な処理を作るときなどに便利な方法です。
次の例では、変数valueには文字列型の値が格納されているため、when Stringの型判定と一致し、画面には「String型です」と表示されます。
value = "ruby"case valuewhen Integer puts "Integer型です"when Float puts "Float型です"when String puts "String型です"else puts "それ以外の型です"end
実行結果-------------------String型です
型の判定についても、when節にカンマで区切って複数の条件指定にできます。
value = 123.456case valuewhen Integer, Float puts "数値です"when String puts "文字です"else puts "それ以外の型です"end
実行結果-------------------数値です
正規表現で条件を分岐する
when節に正規表現を指定して条件分岐することも可能です。正規表現(Regexpオブジェクト)は、`““て囲われた中に指定します。
lang = "ruby on rails"case lang when /java on/ puts "java onにまっち"when /ruby on/ puts "ruby onにマッチ"else puts "どの正規表現にもマッチしませんでした"end
実行結果-------------------ruby onにマッチ
値が配列の中に存在するか判定する
あまり利用するシーンは少ないかもしれないが、caseで指定した変数や値が配列に含まれているかを判定できます。
次の例ではcase文で指定した値が、array1に含まれている時と、array2に含まれている時、それ以外のケースで条件分岐をするサンプルコードです。
value = 100array1 = [10, 20, 30, 40, 50]array2 = [70, 80, 90, 100, 110]case valuewhen *array1 puts "value is contained in array1"when *array2 puts "value is contained in array2"else puts "どの配列にも含まれません"end
実行結果-------------------value is contained in array2
Rubyの「case」文には「break」は必要?
JavaやC言語での「switch」は、when節のブロックの最後にbreakが必要ですが、Rubyの「case」ではbreakを記述する必要がありません。
switch (比較対象とする変数など){ case 値1: //値1と一致した時の処理 break; case 値2: //値2の一致した時の処理 break;}
さいごに
ほかの言語では「switch」文として使われる、Rubyの「case」文の使い方について解説していきました。
Rubyには「case」文の他に「if」構文で条件分岐も行います。この「if」と「case」文の使い分けには明確なルールは存在しませんが、最終的にコードの可読性が上がる方を選ぶのがよいでしょう。
【関連記事】
▶Rubyのif文で条件分岐!数値や文字列の比較方法を解説
Rubyの「case」文では、breakを記述すると、逆にコンパイルエラーになるので注意しましょう。