こんにちは!システムエンジニアのオオイシです。
unless文をご存知ですか?
if文と似たような条件文にunless文はRailsでも使えます。
「unlessはどのような時に使うの?」
「if文との違いは?」
「Railsでunlessはどのような時に使う?」
と、お悩みのあなたに、今回は以下の内容について解説していきます!
【基礎】unless文とは
【基礎】unlessはどのようなときに使うの?
【基礎】unless文の使い方
【応用】unlessを複数繋げる
【応用】unlessを1行で書く
unlessについて初心者でもわかりやすいように解説していますので、しっかりと理解しておきましょう!
unless文とは
unless文はif文の反対で、
- if文 → もしも、評価が真(true)であれば○○する
- unless文 → もしも、評価が偽(false)であれば○○する
の意味になります。
構文は次の通りです。
unless構文:
unless 条件式 条件式の結果が 偽(false) の場合に処理を実行 else 条件式の結果が 真(true) の場合に処理を実行 end
ちなみに、Rubyで真(true)と偽(false)の判定条件は、
- 偽(false) = nil、または false
- 真(true) = 上記以外
です。
Ruby または Rails経験者でも以外と知らないので、知っておきましょう。
なお、if文の使い方については、こちらで詳しく解説しているので、ぜひ参考にしてみてください。
unlessはどのようなときに使うの?
unless文はif文でも表現できますが、unless文で書くと可読性が高くなる場合があります。
# モデルが存在することを否定 if モデル.!present? # モデルが存在しない unless モデル.present?
では、後者の方が直感的です。
なぜならば、人間の頭は否定で考えるのが苦手だからです。
そのため、unless文はわかりやすたのために使います。
それでは、Railsを使ったunlessを使ったサンプルを紹介していきましょう!
unless文の使い方
サンプルモデルの作成
まずはじめに、unlessを確認するためのSampleモデルを作成します。
$ bin/rails g model sample $ bin/rake db:migrate
unless 基本
Sample.newした結果をもつ変数をunlessで評価してみましょう。
モデルがデータベースに保存済みの場合は真(true)を返す
- モデル.persisted?
メソッドを使って、DBにモデルデータを保存していないことを確認するサンプルコードを見てみましょう。
sample = Sample.new unless sample.persisted? # -> false puts "DBに保存していない" else puts "DBに保存した" end
実行結果:
DBに保存していない
このように、条件式がfalseの場合に評価されることがわかりました。
unless nil
unlessの条件式の結果がnilの場合についても見てみましょう。
sample = Sample.new unless sample.id # -> nil puts "sample.idはnil" else puts "sample.idは存在する" end
実行結果:
sample.idは存在する
このように、unlessはnilの場合でも評価されることが確認できました。
unless true
unlessの条件式が真(true)になるケースもみてみましょう。
Sampleモデルを保存してデータが存在する場合にelse側が処理されることを確認してみます。
sample = Sample.new sample.save unless Sample.all.present? # -> DBデータあり puts "Sampleモデルはデータなし" else puts "Sampleモデルはデータあり" end
実行結果:
Sampleモデルはデータあり
このように、オブジェクトが存在する場合には、unlessは評価しないことが確認できました。
unlessを複数繋げる
unless文はif文と同様に&&(AND)や||(OR)を使って、複数の条件が指定できます。
サンプルコードで確認してみましょう。
unless nil && false puts false end
実行結果:
false
このように、unlessを複数繋げてコーディングできました。
unlessを1行で書く
unless文はif文と同様に、1行で条件分岐できる後置unlessが使えます。
モデルデータをDBに保存していない場合にsaveメソッドを実行するサンプルコードを確認してみましょう。
保存したらtrueが返却されます。
sample.save unless sample.persisted? => true
このように、unlessを1行で書くことができました。
まとめ
いかかでしたか?
今回は、unlessについて紹介しました。
unless文は「もしも、評価が 偽(false)であれば○○する」の意味になります。
unlessを使うとわかりやすくコーディングできるので、ぜひ試してみてください!
そして、unlessの使い方を忘れてしまったらこの記事を確認してくださいね!