プログラムに判断力を与えるif文と同じように、switch文もプログラムにちょっとした知性を吹き込むために使うことができます。 実際、switch ステートメントは基本的に if ステートメントを特殊化したもので、そうしないと ELSE IF
型のステートメントが過剰になってしまいます。
では、なぜswitch文が使われるのかを見てみましょう。
プログラムにロジックを組み込んでいると、あるデータの値が与えられたときに、別のことをしたいという状況に遭遇することがあります。
if文を使うと、プログラムはすぐにif文の構文でごちゃごちゃになってしまい、何が起こっているのかあまり読みやすくありません。 プログラマーはこれに気づき、スイッチ ステートメントが生まれました!
スイッチ ステートメントの構造
スイッチ ステートメントは 1 つの値を受け取り、ブーリアン式を使用して他の値の束と比較します。 これらのブール式の 1 つが真の場合、特定のコードが実行されます。
この構造により、値を実行すべきコードの一部に簡単にマッピングすることができます。 以下の簡単なswitch文を見て、Rubyの構文を理解してください。
Copymy_grade = "A "case my_grade when "A" puts "You Pass" when "F" puts "You fail" else puts "Invalid grade "end
上にあるように、myGrade
という値から始まります。 基本的には、学生の成績 (A または F) に基づいて、合格または不合格を出力したいと考えています。
さて、値を受け取ったら、一連のcase文を設定します。 これらのcase文は、基本的には、等質性を表すブール式の右辺です。 Rubyは、myGrade
とcase文の各値(’A’と’F’)とを比較して同等性を判断します。
ブレーク
switch文で覚えておくべき重要なことは、デフォルトでは、Rubyはマッチした場合でも、すべての値が等しいかどうかをチェックしようとするということです。 これは、ELSE IF
構造のように、ある条件が真であれば下の条件のチェックを止めるのとは異なります。
Rubyは何があっても自動的にすべてのケースをチェックするので、これを防ぐ方法が必要です(ほとんどの場合、これを防ぎたいと思うでしょう)。
そこで、break
キーワードの出番です。 breakキーワードは、switch文の処理が終わったことをRubyに伝え、switch文から抜け出して先に進むべきだとしています。
個人的には、書いたプログラムの中でbreak文を入れるのを忘れてバグに遭遇したことが結構あります。 ですから、このことを頭の片隅に置いておいてください。
Default
上の switch 文を見ると、default
キーワードがあることに気づきます。 このキーワードは、if文の構造の中のELSE
と同じような働きをします。 defaultステートメント以下のコードは、他のケースにマッチしなかった場合に実行されます。 また、default文の中にはbreak文が必要ないことにも注目してください。
通常、switch を使用している状況では、default は case 文で指定したくない状況を捕捉するだけです。
上のプログラムの場合、A
F
Invalid Grade
を出力しています。
まとめ
実際には、switch ステートメントは if ステートメントよりもはるかに少ない頻度で使用されます。 その理由は、if文よりもswitch文の方が適切な場面がはるかに少ないからです。 しかし、良い経験則としては、1 つの値を他の多数の値と比較して等質性をチェックする必要がある場合、switch が必要になるかもしれません。