【初心者必見】Rubyのunlessの使い方まとめ!

こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。

今日はRubyのunlessについて書きたいと思います。

unlessって少し独特な書き方をしますよね?
なので、
「unlessってどうやって書くの?」
「ifとunlessってどう違うの?」
という方がいても当然です。

さらに、ifと同様にunlessも、後置unlessという使い方があります。
そのため、
「後置unlessってどんな風に書くの?」
「後置unlessってどんな風に便利なの?」
という風に興味を持たれると思います。

そこで!今日は、

  • unlessとは
  • ifとunlessを比較しまとめ
  • 後置unlessの使い方まとめ

について、書いてみたいと思います。

目次

rubyのunlessとは

unlessの基本の使い方

unless は、基本的にifの使い方とほぼ同じです。

ifは、条件式が真のとき(条件式が成り立つとき)、then~endの処理を実行します。

逆にunlessは、条件式が偽のとき(条件式が成り立たないとき)、then~endの処理を実行します。

以下、順を追って見ていきましょう。

サンプルコード(if):

a = 3
if a > 2 then
  p "a grater than 2"
end
p "end"

サンプルコードの実行結果:

"a grater than 2"
"end"

以上のように、ifの条件式 a > 2 が成り立つため、ifのthen~endのコードが実行されています。

続いて、unlessのコードです。

サンプルコード(unless):

a = 3
unless a == 2 then
  p "a is not 2"
end
p "end"

サンプルコードの実行結果:

"a is not 2"
"end"

以上のように、unlessの条件式 a == 2 が成り立たないため、unlessのthen~endのコードが実行されています。

上記、unlessの箇所を、ifで書いた場合、if a != 2 then ~ end となります。

少しif文が読みにくくなりますね。

このように、unlessはifだと条件式が複雑になる場合に用いることができます。

コードが簡潔なことは、デバッグにもテストにも、コードの保守にも、大変良いことですので、積極的にunlessを使いましょう。

unlessのand、or

if文でのandとorは、そのまま、読むことができました。

例を挙げましょう。

if文のandは、条件式が共に成り立つ場合にthen~endを処理すると、以下のように書きます。

if 式1 and 式2 then ~ end

if文のorは、条件式のどちらかが成り立つ場合にthen~endを処理すると、以下のように書きます。

if 式1 or 式2 then ~  end

unlessでは、andは、条件式のどちらかが成り立たない場合にthen~endを処理すると、以下のように書きます。

unless 式1 and 式2 then ~ end

これは、if文で書く際は、

if ! ( 式1 and 式2 ) then ~ end

という意味で書きます。ちょうど、unlessはifの真逆の判定になっていますね。

unlessでのorは、条件式のどちらとも成り立たない場合にthen~endを処理すると、以下のように書きます。

unless 式1 or 式2 then ~ end

これは、if文で書く際は、

if ! ( 式1 or 式2 ) then ~ end

という意味で書きます。これもちょうど、unlessはifの真逆の判定になっていますね。

このように、unlessはifのときの条件式の値が真逆のときに、then ~ endを実行します。

unlessのthenの省略

unlessは、ifと同じく、thenを省略して書くことができます。

サンプルコード:

a = 2
b = 3
unless a == 1 or b == 2
  p "neither are not equal"
end
p "end"

サンプルコードの実行結果:

"neither are not equal"
"end"

ただし、unlessを1行で書く場合は、thenを省略できません。

これは、1行で書く場合、thenを省略すると、どこまでがunlessの条件式で、どこまでがunlessの条件分岐後の式(コード)なのか、rubyが判別できなくなるためです。

サンプルコード:

a = 2
b = 3
unless a == 1 or b == 2 then p "neither are not equal" end

サンプルコードの実行結果:

"neither are not equal"

以上のように、if文と同様に、unless文も1行で書く際は、thenを省略できません。

1行でかかない場合は、改行文字がthenの代わりになるため、thenを省略できる、というrubyの構文上の制約です。

1行で書くrubyの後置unless

unlessの後置の基本構文

後置unlessとは、いろいろな式の後にunlessを置くrubyの構文のことです。

同様に後置ifという構文もあります。

後置ifはifの条件式が真のときだけ(条件式が成り立つときだけ)、ifの前の式が実行されます。

逆に、後置unlessは、unlessの条件式が偽のときだけ(条件式が成り立たないときだけ)、unlessの前の式が実行されます。

後置unlessを使用すれば、1行で処理を書くことが非常に簡単にできます。

then や end を書かなくても、コードが書けます。そのため、可読性も高まります。

これは後置unlessの大きなメリットです。

サンプルコード:

a = 1
b = 2
p "if done" if a == 1
p "if not done" if b == 3
p "unless done" unless a == 2
p "unless not done" unless b == 2

サンプルコードの実行結果:

"if done"
"unless done"

以上のように、後置ifは条件式が成り立つ a == 1 のときだけ、後置unlessは条件式が成り立たない a == 2 のときだけ、実行されていますね。

unlessの後置と、nil?、empty?、blank?、present?

後置unlessとnil?、empty?、blank?、present?などのメソッドを同時に使用すると、コードの意味が把握しやすくなるため、可読性があがります。

これは、デバッグやテスト、コードを保守する際にメリットがあります。

nil?以下、各メソッドは、以下の意味を持っています。

メソッド メソッドの意味
nil? 変数の値がnilまたは、値なしの場合、真となります。
empty? 変数の値が””(文字列の場合)や値が空白の場合、真となります。
nil?との違いは、empty?は変数の値はあることはあるが、その値が空をしめしている、という点です。
blank? railsで拡張されたメソッドです。
nil?が真となる場合、または、empty?が真となる場合に、blank?は真となります。
簡単に言えば、blank?は値といえるものがない場合、真となります。
present? present?は、「存在している?」という意味で、blank?全く逆の動作をします。present?は、値といえるものがある場合、真となります。

いずれも、後置unlessと併用すると、利便性高く、可読性も高いコードになります。

サンプルコード:

a = 2
b = "not empty"
p "a is not nil" unless a.nil?
p "b is not empty" unless b.empty?

サンプルコードの実行結果:

"a is not nil"
"b is not empty"

以上のように、コードが読みやすく簡潔になっていますね。

unlessの後置と括弧

if文は、条件式が偽のとき(式が成り立たないとき)、then ~ endを実行せずに、nilを返します。

同様に、unlessは、条件式が真のとき(式が成り立つとき)、then ~ endを実行せずに、nilを返します。

後置if、後置unlessでも同様に、if、unlessの前にある式を実行せずにnilを返します。

このため、後置unlessでうっかり、

c = 1
a = ( 1 unless c < 2 )

のようなコードを書くと、aにはnilが入ってしまいます。

( 1 unless c < 2 )は、unlessの条件式 c < 2 が成り立つため、「1」という式が実行されず、nilを返すためです。

逆に、

a = 10
c = 1
a = 1 unless c < 2

のようなコードを書くと、条件式 c < 2 が成り立つため、「a = 1」という式が実行されずaは10のままとなります。aはnilになりません。

サンプルコード:

c = 1
a = ( 1 unless c < 2 )
p a

a = 10
c = 1
a = 1 unless c < 2
p a

サンプルコードの実行結果:

nil
10

以上のように、後置unlessで括弧を付ける際は、注意が必要なことが分かりました。

まとめ

いかがでしたでしょうか。

ifは便利ですが、unlessも覚えておくと、rubyを大変便利に使えることが分かりました。

ifとunlessの構文を比較して、unlessをどういう場合に使用すると効果的なのかも確認していきました。

さらに、unlessでandやorを使用する際の注意点についても解説していきました。

ifの条件式を考えていると、unlessの条件式の特性を間違えてしまう場合もありますので、気をつけられてください。

また、unlessでthenを省略できる構文も確認しました。

加えて、後置unlessに関して、基本的な構文から、後置unlessを応用した構文まで、まとめて解説してきました。

後置unlessは、コードを書く上で、非常に強力な武器となってきますので、この機会に、ぜひ、覚えられてください。

rubyのunlessの使い方を忘れたら、またこの記事を読み返してみてください。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次