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

【初心者必見】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の使い方を忘れたら、またこの記事を読み返してみてください。

この記事を書いた人

こんにちは!貝原(@touhicomu)と申します。
現在は、Web業界のフリーランスとして、主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務を受注しています。
現住所は、日本の西海岸、長崎県は波佐見町です。田舎ライフです。^^
地元の観光団体「笑楽井石」にボランティアでほたる撮影会やそば塾などのスタッフとして参加させて頂いています。
以下の活動も行っています。
 ・笑楽井石のブログ
 ・エクセル関数を日本語化するソフト
 ・エクセルVBAを日本語で記述するソフト

目次