Rubyには条件分岐を行う構文として「if」と「case」があります。
「if」文は、条件に一致した時だけ行う処理を実装する時に使用し、「case」文は複数の候補の中から一致する条件の処理を行う処理を実装する時に使用します。
if文とは
「if」構文は、ある条件の時だけ特定の処理を実行したり、逆に条件に一致しなかった時に実行される処理を記述したりするなど、条件によって処理を分ける時に使用する制御構文です。
Rubyにおける「if」文の構文は次の通りです。
if 条件式 then
#条件式が一致した時に実行される処理
end
Rubyではthenキーワードは省略してもよい事になっているため、次のようのthenを省略した書き方もできます。
if 条件式
#条件式が一致した時に実行される処理
end
elsif構文を使用して、複数の条件式を記述することもできます。
次の例ではifで指定した条件式1に一致しなかったこ時に、条件式2、条件式3の順に判定していき、どの条件にも一致しなかった時に、elseブロックの中の処理が実行されます。
if 条件式1 then
#条件式1に一致する時に実行される処理
elsif 条件式2
#条件式2に一致する時に実行される処理
elsif 条件式3
#条件式3に一致する時に実行される処理
else
#どの条件にも致しなかった時に実行される処理
end
case文とは
「if」文が条件式を組み合わせて複雑な条件分岐を扱えるのに対し、「case」文は、変数や計算式の結果から一致する値の候補を探して、一致した値の処理を実行する時に便利な構文です。
Rubyの「case」文の構文は次の通りです。
case 比較対象とする変数など
when 値1 then
#値1と一致した時に実行される処理
when 値2 then
#値2と一致した時に実行される処理
else
#いずれの値に一致しない時に実行されるとき
end
「if」が結果がtrueまたはfalseになる条件式を組み合わせるのに対し、「case」は比較対象の変数などの値の候補をwhen <値>:で1つ以上指定します。
そして、比較対象の変数などと一致するwhen <値>:があると、その下のコードブロックが実行されまます。when <値>:で指定された候補の値のいずれにも一致しない場合は、elseで指定したコードブロックが実行されます。
ちなみにcase文も、thenキーワードは省略してもよい事になっているため、次のようのthenを省略した書き方もできます。
case 比較対象とする変数など
when 値1
#値1と一致した時に実行される処理
when 値2
#値2と一致した時に実行される処理
else
#いずれの値に一致しない時に実行されるとき
end
値の範囲、以上、以下を調べる時
「case」文で値の範囲や、ある値以上・以下を調べる時は、when 開始…終了のように範囲を指定できます。
case value
when 0..10
puts "値は0-10の範囲内です"
else
puts "範囲外です"
end
開始にnilを指定すると、終了以下の値であることを判定でき、終了にnilを指定すると開始以上の値であることを判定できます。
case value
when nil..19
puts "値は19以下です"
when 20..nil
puts "値は20以上です"
end
「if」と「case」の使い分け
「if」と「case」文は、どちらも条件分岐を行う構文で「if」文で書けることは基本的に「case」でも書くことができ、どちらを使うべきかの明確なルールは存在しません。
では、「if」と「case」文はどのように使い分ければよいのでしょうか?
実例のサンプルコードを用いながら、「if」と「case」文のそれぞれに適した利用シーンを見ていきましょう。
シンプルな条件の二分岐
まずは、条件に一致した時と、一致しなかった時で処理が分かれる二分岐で、「if」と「case」文をそれぞれ使ってみます。
【if文】
if rank == "A" then
puts "ランク「A」です"
else
puts "ランク「A」以外です"
end
【case文】
case rank
when "A"
puts "ランク「A」です"
else
puts "ランク「A」以外です"
end
このように、シンプルな条件の二分岐であれば、「if」と「case」文どちらを使ってもコードの可読性は高くなりますが、このようなケースの場合は「if」の方が一般的に用いられます。
ただし、上のコードが将来的にランクB,C,D…のように
複雑な条件の二分岐
複数の条件があるような複雑な条件の時は、多くの場合で「if」文を使用します。
次のサンプルコードは、2つスコアが共に80点以上なら「合格」、どちらか一方が50点以上なら「再テスト」、いずれも50点未満なら「不合格」とするような条件分岐を「if」と「case」文で書いたものです。
【if文】
if scoreA >= 80 and scoreB >= 80
puts "「合格」です"
elsif scoreA >= 50 or scoreB >= 50
puts "「再テスト」です"
else
puts "「不合格」です"
end
【case文】
case scoreA
when 80..nil
case scoreB
when 80..nil
puts "「合格」です"
else
puts "「再テスト」です"
end
when 50..79
puts "「再テスト」です"
when nil..49
case scoreB
when nil..49
puts "「不合格」です"
else
puts "「再テスト」です"
end
end
このように、「case」で複雑な条件を表現するとコードの可読性が悪くなりがちになるため、複雑な条件の時は「if」文を用います。
多分岐
多分岐とは、if 〜 elsie 〜 elseなどを使って複数条件を記述し、条件によって3つ以上の処理ブロックに処理が分岐することを指します。
次のサンプルコードは、ランクA、B、C、Dとそれ以外のランクにって条件分岐するコードを「if」と「case」文で書いたものです。
【if文】
if rank == "A" then
puts "ランク「A」です"
elsif rank == "B"
puts "ランク「B」です"
elsif rank == "C"
puts "ランク「C」です"
elsif rank == "D"
puts "ランク「D」です"
else
puts "ランクA〜D以外です"
end
【case文】
case rank
when "A"
puts "ランク「A」です"
when "B"
puts "ランク「B」です"
when "B"
puts "ランク「B」です"
when "B"
puts "ランク「B」です"
else
puts "ランクA〜D以外です"
end
このように、条件が3つ以上ある多分岐で、条件式もある程度シンプルであればな「case」文の方が可読性が高くなります。
if, caseの使い分けは可読性を重視
先述のように、「if」と「case」文の使い分けには明確なルールが存在しません。
使い分けにも諸説ありますが、「if」と「case」文の使い分は、基本的にはコードの可読性や後々のメンテナンス性が高いほうを選ぶのが良いでしょう。
さいごに
「if」と「case」文の基本的な構文と、その使い分けについて解説してきました。
よいプログラマ とは、可読性が高いコードを書けるのも一つの要素ですので、この記事で紹介した「if」と「case」文の使い分けを実践していきましょう。
【関連記事】
▶Rubyにおけるブロック構文(do~end)の使い方
whenで値を指定する時に、カンマで区切って複数の値を指定することも可能です。
when 値3,値4,値5 then