こんにちは!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の使い方を忘れたら、またこの記事を読み返してみてください。