これからRubyの勉強を始めようと考えているあなたに、Rubyのプログラムの書き方を紹介します。
この記事では、Rubyでの条件分岐(if文、case文、unless文)の使い方について解説します。
プログラムでの条件分岐
プログラムでは、変数の条件によって処理を分けたいという状況が多くあります。
例えば、
- Webサービスで、会員のランク(無料会員と有料会員)で使える機能を分けたい
- 変数の値がマイナスの時は0として処理したい
などが挙げられます。
このように変数の条件によって、処理を分岐させることを条件分岐と言います。
rubyでは、この条件分岐を行う文法に大きく3種類の書き方があります。
- if
- case
- unless
の3種類です。
それぞれの文法について、解説していきます。
if文
変数が条件を満たす時に、ブロック内の処理を実行するのがif文です。
プログラムの構文は以下のようになります。
条件式を満たす時(trueの時)のみ、thenからendまでのブロックに書かれた処理が実行されます。
if 条件式 then
条件式を満たした時(true)に実行する処理
end
例えば、変数の値が0より大きい場合のみ変数から1を引くという処理を行う場合は、
以下のように書きます。
a = 5
if a > 0 then
a -= 1
end
puts(a) # 4が出力される
if文では条件式を満たす時(trueの時)の処理の他に、条件式を満たさなかった時(falseの時)に実行する処理を書くことが可能です。
プログラムの構文は以下のようになります。
if 条件式 then
条件式を満たした時(true)に実行する処理
else
条件式を満たさなかった時(false)に実行する処理
end
例えば、変数の値が、0より大きい場合のみ変数から1を引くという処理を行い、0以下の場合は変数に1を加えるという処理は、
以下のように書くことができます。
a = -3
if a > 0 then
a -= 1
else
a += 1
end
puts(a) # -2が出力される
また、if文では複数の条件を設定してそれぞれの条件式を満たした時に、処理を行うことが可能です。
プログラムの構文は以下のようになります。
if 条件式1 then
条件式1を満たす時(true)の処理
elsif 条件式2 then
条件式2を満たす時(true)の処理
elsif 条件式3 then
条件式3を満たす時(true)の処理
else
どの条件式も満たさない時(false)の処理
end
例えば、
- 変数が2の倍数の場合
- 変数が3の倍数の場合
- 変数が2と3の倍数の場合
のそれぞれの場合で処理を行う場合を考えてみます。
単純に上の条件をそのまま書くと、
a = 2
if a % 2 == 0 then
puts("2の倍数です")
elsif a % 3 == 0 then
puts("3の倍数です")
elsif (a % 2 == 0) & (a % 3 == 0) then
puts("2と3の倍数です")
else
puts("2の倍数でも3の倍数でもありません")
end
となります。上記の例では、aは2なので、「2の倍数です」というメッセージが表示されます。
今度は、aが6の場合は、どうなるでしょうか?
6は2と3の倍数なので、「2と3の倍数です」というメッセージが出て欲しいと思います。
しかし、上の書き方だと、「2の倍数です」というメッセージが表示されてしまいます。
if文で複数の条件式を書いた場合、一番はじめに条件式を満たした時の処理が実行されます。
上記の例だと、
elsif (a % 2 == 0) & (a % 3 == 0) then
の前に、a % 2 == 0
の条件式を満たすので、
「2の倍数です」というメッセージが表示されてしまいます。
これを避けるためには、(a % 2 == 0) & (a % 3 == 0)
の条件式を先に書く必要があります。
書き直すと以下のようになります。
a = 6
if (a % 2 == 0) & (a % 3 == 0) then
puts("2と3の倍数です")
elsif a % 2 == 0 then
puts("2の倍数です")
elsif a % 3 == 0 then
puts("3の倍数です")
else
puts("2の倍数でも3の倍数でもありません")
end
if文で複数の条件式を書く場合は、複数の条件式を満たすような変数の場合に注意して書きましょう。
case文
if文では、条件式を組み合わせて複雑な分岐を行うことができます。
しかし、プログラムでは、1つの変数の値に応じて、処理を変更するという状況も多くあります。
そのような状況の時には、if文を使って書くこともできますが、case文という構文を使うと便利です。
構文は以下のようになります。
case 対象オブジェクト
when 値1 then
値1と一致する場合の処理
when 値2 then
値2と一致する場合の処理
when 値3 then
値3と一致する場合の処理
else
どの値とも一致しない場合の処理
例えば、ユーザーのステータスに応じて、処理を変えるような処理は以下のようにかけます。
status = "プレミアム会員"
case status
when "無料会員" then
puts("無料会員です。")
when "プレミアム会員" then
puts("プレミアム会員です。")
else
puts("不正な会員ステータスです。")
end
ある変数に対して、値に応じて処理を行うという場合は、case文を使った方が見た目もスッキリしますし、値に応じた処理であることが分かりやすいのでif文よりもcase文を使うようにしましょう。
unless文
if文では条件式を満たした時(true)に、処理を実行しましたが、unless文では条件を満たさなかった時(false)に処理を実行する構文になります。
構文は以下のようになります。
unless 条件式 then
条件式を満たさなかった時(false)に行う処理
end
また、if文の時と同様に「else」を使うことができます。こちらは、if文とは逆に、条件式を満たした時に処理が実行されます。
unless文は条件式に否定演算子「!」をつけることで、if文で書き換えることができます。
unless文で書いた方が意味が理解しやすい場合があるので、そういった場合に使います。
例えば、会員ステータスが「無料会員」以外の場合に処理を行う場合、unless文を使うと以下のようにかけます。
status = "有料会員"
unless status == "無料会員" then
puts("無料会員ではありません")
end
基本的にはif文が分かれば大丈夫ですが、こういった書き方もあるということを覚えておきましょう。
まとめ
この記事では、Rubyでの条件分岐の使い方について解説しました。
条件分岐はプログラミングの基本なので、しっかりと理解しましょう。
以下の講座で体系的に学ぶのもオススメです。