Rubyではif構文とは逆の条件で分岐するunless構文が使えます。なお英語のifはどのような条件でも使えますが、unlessはネガティブな条件で使われる単語です。そしてunlessはRubyのプログラムでも同じようにネガティブな条件で使われます。
処理によってif構文の代わりにunless構文を使うことで読みやすいプログラムを記述することが可能です。今回はunless構文の使い方がよくわからないという方に、Rubyにおけるunless構文の使い方について解説します。
ifとunlessの違いは
Rubyに限らずプログラムでは条件分岐としてよくif構文が使われます。もちろんRubyでもif構文が使えるので、条件分岐といえばif構文を思っている方もおられるでしょう。
しかし多くのプログラム言語でunless構文もサポートしています。ではなぜif構文の他にunless構文も用意されているのでしょうか。まずはif構文とunless構文の違いについて紹介します。
ifとunlessの違いのポイント
プログラミング言語で使われるifとunlessは両方とも英語が語源です。ifとunlessにはどんな違いがあるのでしょうか。
まずifは「もし~ならば」という意味です。これはRubyなどのプログラミング言語でも同じです。さらにifは、if~notという表現でも使われます。この場合は「もし~でないならば」という意味です。つまり英語のifと同じくプログラム言語でも、ポジティブな条件とネガティブな条件の両方を表せます。
一方unlessは、「もし~でないならば」という意味で、英語ではネガティブな条件で使われます。そのためプログラム言語でもunlessはネガティブな条件で使われる点に注目してください。
プログラミングのifはtrueもfalseもOK
先ほど紹介したように英語のifはポジティブな条件とネガティブな条件の両方を表せるように、プログラムで使われるif構文も両方で使われます。
具体的には「if 条件 then」と「if not 条件 then」の両方が使えます。
「if 条件 then」構文の例
if a == b then puts "a == b" end
「if not 条件 then」構文の例
if not a == b then puts "not a == b" end
なおif構文では、「条件」または「not 条件」がtrueの場合分岐する点に注意してください。
unlessはネガティブな条件で使う
一方、英語のネガティブな条件で使われるunlessは、プログラムでもネガティブな条件で使われます。具体的には先ほどのif構文の条件がtrueなのに対し、unless構文は条件がfalseの場合、条件に合致しない場合に分岐します。
普段から英語を使っている方ならif構文とunless構文を英語で書くように使い分けますが、そうでない方はunlessを使わずにプログラムを書いているかもしれません。
ネガティブな条件では「if not 条件 then」の代わりに「unless 条件 then」を使ってみてください。
unless構文の基本
unless構文はRubyの制御構造の1つで、if構文とは逆の条件で使えます。ただし、同じ処理をif構文でも記述できるので、英語を普段から使わない方はunlessを使ったことがない、という方もいるかもしれません。
次からunlessの使い方の基本について紹介します。
unless構文の文法
unless構文はif構文と反対で、条件式がfalseの場合にthen以下の式を評価します。またif構文と同じようにelseも利用できますが、その場合はif構文とは逆にtrueのケースです。
unless構文
unless 条件式 then
条件式がfalseの場合に評価する式
end
unless 条件式 then
条件式がfalseの場合に評価する式
else
条件式がtrueの場合に評価する式
end
なおif構文のようなelsifはunlessにはありません。複数の条件を使う場合はif構文を利用してください。
Rubyでfalseになる条件とは
unless構文でthenに続く式を処理できるのは、条件式がfalseとnilのケースだけです。なおRubyにおけるfalseとは、falseとnilの2つだけです。
Ruby以外のプログラミング言語の中には、false以外に0や空白文字をfalseと判定する言語もあります。しかしRubyではfalseと判定しません。unlessを利用する場合、条件式の結果がfalseまたはtrueになるように記述してください。
unless構文の使用例
先ほど紹介したように英語のunlessはネガティブな条件を表現する構文です。Rubyのプログラムでも、ネガティブな条件を表現で使用することで読みやすくなります。
次にunless構文の使用例を紹介します。
Ruby on Railsのpresent?に組み合わせる
Rubyに限らず、変数に値が格納されているかをチェックし、もし値が格納されていれば続く処理を実施する、という構文がよく使われます。そしてRuby on Railsには変数をチェックするメソッドとして、blank?メソッドとpresent?メソッドが用意されています。
もし、変数に値が格納されていないケースを処理するプログラムを、if構文とunless構文とで比べてみましょう。
if構文による変数チェック処理の例
if value.blank? then value = initialize_one() end
unless構文による変数チェック処理の例
unless value.present? then value = initialize_one() end
この2つの書き方は、どちらが読みやすいかで使い分けることになりますが、変数が未定義なケースをチェックするならpresent?メソッドにunlessを組み合わせた方がよく使われます。
unless修飾子を使う
Rubyでは簡単なif文をif修飾子を用いて1行で簡潔に記述できます。if修飾子は条件がtrueのケースに実行しますが、条件がfalseのケースで実行できるのがunless修飾子です。
次からunless修飾子について紹介します。
unless修飾子の文法
unless修飾子は、unlessの左側に実行する式を、またunnlessの右側に条件式を書くことで、条件式がfalseの場合にのみ指定した式を実行します。また条件式がtrueの場合に返す値はnilです。
unless修飾子の文法
条件がfalseの場合に実行する式 unless 条件式
unless修飾子の例
chk = false print "stop\n" unless chk
この例では、unless修飾子の条件としてchkを評価し、それがfalseなのでprint “stop\n”を実行します。
unless修飾子利用時の注意点
unless修飾子を使って条件式がfalseの場合、実行した式の結果を変数に代入する使い方が可能です。しかし条件式がtrueの場合、unless修飾子がnilを返すので、変数にnilが代入されてしまいます。もしその変数を後の処理で利用する場合、誤動作の原因になるので注意してください。
nilが代入されるunless修飾子の例
chk = true out = "False" unless chk
このままでは変数outにnilが代入され、次の処理に使われてしまいます。次のように直接代入するのではなく、メソッド経由で代入するなどして使ってください。
def unless_out( chk ) return("False") unless chk return("True") end out = unless_out( true ) p out # "True"が表示される
まとめ
これまで紹介したようにRubyではif構文の他にunless構文が使えます。なお英語のunlessはネガティブな表現に使われる構文のため、Rubyのunlessもネガティブな条件分岐に使われます。
英語が苦手な方はifとunlessは判定条件が逆なだけで同じ条件分岐の構文と思われるかもしれません。しかし、処理内容によってif構文とunless構文を使い分けると、読みやすいプログラムを書くことが可能です。ぜひunless構文を使いこなしてください。
Rubyで偽として扱われるのは、falseとnilの2つだけで、その他全てのオブジェクトが真として扱われます。
偽: falseとnilの2つのみ
真: falseとnil以外の全てのオブジェクト