【Ruby】if文を使っての条件分岐を徹底解説!

Ruby

if文とは

ある条件の時にはAの処理を行い、別の条件の時にはBの処理を行うなど、条件によって処理を分けたい時に使う構文です。

条件分岐
リンクをコピーしました

プログラミングをしていると条件によって処理を変えたいというときが頻繁に訪れます。
例えばユーザー登録機能があるアプリを作成する時、ユーザーがログインしていれば「ログアウト」ボタンを表示して、ログアウトしていれば「ログイン」ボタンを表示させたいですよね?

そんな条件毎に処理を変えたい時に使うのが条件分岐の制御構文になります。
ifはそんな制御構文の一つで下記のように定義します。

ruby
1
2
3
4
5
if 条件式 then
  条件式がtrueの時に実行されるコードA
else
  条件式がfalseの時に実行されるコードB
end

上のコードの場合、条件式がtrueであればAのコードが実行され、true以外、すなわちfalseの時にはBのコードが実行されます。
ちなみに最初の行のthenは省略が可能で、あまり書くことはありません。
実際にコードを書いて実行してみましょう。

if
上の動画ではnumという変数に数字の0を代入しています。
そしてif文の条件式の中でnumが0であればその下のコードの「puts "0です。"」を実行します。
numが0以外であればelseの下のコード「puts "0以外の数字です。"」というコードが実行されます。
条件式の返り値はtrueなので「puts "0です。"」が実行されました。

今回のコードではnumという変数は0に固定されているので、実際にユーザーに入力してもらうようgetsメソッドを使ってみましょう。

if文
今回はnumにターミナルで入力された5という数字が入ったので、条件式は 5 == 0 でfalseが返ります。
よってelseで指定したコードが実行されたというわけです。

では条件を増やしたい時にはどうしたら良いのでしょう。

条件を増やしてみよう
リンクをコピーしました

ifとelseだけだと条件は1つしか指定できません。
ですがelsifを使うことにより条件を追加することができます。
「elseif」とsの後にeが入らないので注意しましょう。

ruby
1
2
3
4
5
6
7
if 条件式 then
  実行されるコードA
elsif 条件式
  実行されるコードB
else
  実行されるコードC
end

上のようにifの下に書くと条件を増やすことができます。
流れとしてはまずifの右に書いた条件式の判定が行われ、trueであればAのコードが実行されます。
もしfalseであれば次のelsifの条件式の判定が行われ、trueであればBのコードが実行されます。
もしfalseであればelseで指定したCのコードが実行されます。

elsifは何個でも追加できるので好きなだけ条件を増やすこともできます。

elsif

論理文を使ってみよう
リンクをコピーしました

if文ではある条件を複数個指定したり、他の条件を組み合わせたりすることもできます。

複数の条件を満たす時(〜かつ〜)
リンクをコピーしました

条件式は1つだけでなく、複数の全ての条件を満たす時というふうな書き方もできます。

ruby
1
2
3
4
5
6
7
if 条件式A && 条件式B
   実行されるコード
elsif 条件式
  実行されるコード
else
  実行されるコード
end

上のように「&&」で繋ぐと条件式を増やすことができます。
条件式A && 条件式B && 条件式C というように何個でも指定が可能です。

どれか1つの条件を満たす時(または〜)
リンクをコピーしました

「&&」は全ての条件を満たす時でしたが、どれか1つでも満たせば〜という風な指定も可能です。

ruby
1
2
3
4
5
6
7
if 条件式A || 条件式B
  実行されるコード
elsif 条件式
  実行されるコード
else
  実行されるコード
end

このように「||」と書くと「条件式Aまたは条件式Bどちらかがtrueなら〜」という指定ができます。
ちなみに「|」は「パイプライン(パイプ)」と読みます。

1つの条件の時にだけコードを実行させる方法
リンクをコピーしました

if文ではifの条件式がfalseの時にelseのコードを実行すると書きましたが、elseのコードを指定しないで書くこともできます。
1つの条件の時にだけコードを実行させたい時にはよく使います。

ruby
1
2
3
4
num = 0
if num == 1
  puts "1です。"
end

上のコードの場合、条件式はfalseになるのでif文の中にあるコードは実行されません。

後置if
リンクをコピーしました

またこのようなコードは次のように簡潔に書くこともできます。

ruby
1
2
num = 0
puts "1です。" if num == 1

後置if
この書き方を後置ifと呼びます。
簡単に書けて便利なんですが、非常に長いコードの後にこれを追加すると、かえってわかりづらいコードになってしまうので、使う場所を考えて使用しましょう。

ruby
1
2
3
4
5
6
7
8
9
num = 0
puts "ここで指定したnumという変数に0が入っていればこのコードを実行します。ですがそれ以外の時は何も実行しません。" if num == 0
# 上のコードは横にスクロールしないと後置ifに気づかないため、見づらい

num = 0
if num == 0
  puts "ここで指定したnumという変数に0が入っていればこのコードを実行します。ですがそれ以外の時は何も実行しません。"
end
# このコードだと条件が非常に確認しやすい

if文を使うときの注意点
リンクをコピーしました

if文では条件を何個も追加できますが、上に書いた条件ほど優先して実行されます。
有名なfizzbuzz問題を例にとってみてみましょう。

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
num = 1
while num < 101 do
  if num % 3 == 0
      puts "fizz"
    elsif num % 5 == 0
      puts "buzz"
    elsif num % 15 == 0
      puts "fizzbuzz"
    else
      puts num
    end

  num = num + 1
end

fizzbuzz問題とは1から100までの数字をターミナルに出力し、numが3で割り切れればfizzと、5で割り切れればbuzzと、3でも5でも割り切れれば(つまり15で割り切れれば)fizzbuzzと出力しなさい、それ以外のときはnumに代入されている数字を出力しなさいという、プログラミングでは有名な問題です。

上のコードだとうまく思惑通りの結果になるでしょうか?
実際に確認してみましょう。

fizzbuzz問題
おかしいですね、15のところにfizzと出てしまっています。
なぜでしょうか?

fizzと出力されているということは「num % 3 == 0」という条件に当てはまっているからですね。
つまり15という数字は15で割り切れる他にも3でも割り切れるため、最初の条件が適応されたということです。
これをちゃんと15で割り切れるときの条件を出すにはどうしたらよいでしょう?

そうですね、3で割り切れるという条件より上に書いてあげれば優先して実行されそうです。
では実際にやってみましょう。

fizzbuzz問題
このようにしっかり15で割り切れる時にはfizzbuzzと表示されるようになりました。
上に書いた条件ほど、優先的に実行されるということを覚えておきましょう。

if文以外の条件分岐で使う制御構文
リンクをコピーしました

条件分岐で使う制御構文はif文以外にもあります。

unless文
リンクをコピーしました

if文が条件式がtrueの時に実行したのに対し、unless文は条件式がfalseの時に実行する制御構文です。

ruby
1
2
3
4
5
6
7
8
9
num = 1
unless num > 0
  puts "0より小さいです。"
else
  puts "0より大きいです。"
end

0より大きいです。
=> nil

上のコードの場合、unlessの条件式がtrueなので実行されず、elseで定義したコードが実行されます。
なおunless文ではelsifで条件を追加できないので注意しましょう。

まとめ

if文は条件によって処理を使い分けたい時に使用する構文だよと覚えておきましょう!