Ruby の unless と if:違いと使い分け・後置記法まとめ
Ruby の unless は「条件が偽のときに実行する」制御構文です。if !condition と同じ意味ですが、否定を明示せずに読みやすく書けます。
基本構文の比較
# if で否定を書く場合 if !logged_in redirect_to login_path end # unless で書く場合(同じ意味) unless logged_in redirect_to login_path end
unless は「〜でなければ」と読めるので、否定条件を自然な日本語に近い形で書けます。
if / unless の基本構文
# if if 条件 # 条件が真のとき実行 end # unless unless 条件 # 条件が偽のとき実行 end
else との組み合わせ
# if ... else if score >= 60 puts "合格" else puts "不合格" end # unless ... else unless score < 60 puts "合格" else puts "不合格" end
unless else は if else を逆にしたものです。else ブロックが必要な場合は if の方が読みやすいケースが多いです。
unless に elsif は使えない
# NG:unless に elsif は書けない(構文エラー) unless score < 60 puts "合格" elsif score < 40 puts "再試験" end # OK:条件分岐が複数あるときは if を使う if score >= 60 puts "合格" elsif score >= 40 puts "再試験" else puts "不合格" end
後置 if / 後置 unless
条件が単純な場合は行末に書く「後置記法」が使えます。1行でコンパクトに書けます。
# 後置 if puts "ログイン済み" if logged_in # 後置 unless puts "未ログイン" unless logged_in # 処理の抑制によく使う return if errors.any? next unless item.valid? raise "not found" unless user
後置記法は早期リターンや条件付きスキップの場面でよく使われます。
いつ unless を使うべきか
| 状況 | 推奨 |
|---|---|
| 否定条件1つ・else なし | unless が読みやすい |
| 否定条件1つ・else あり | どちらでも可(if の方が無難) |
elsif が必要 |
if を使う(unless は使えない) |
! や not が重なる |
unless で二重否定を避ける |
| 複雑な条件式 | if を使う(unless は単純な条件向き) |
二重否定は避けるのが鉄則です。
# NG:二重否定で読みづらい unless !valid? save end # OK:if で素直に書く if valid? save end
まとめ
| 構文 | 意味 | 使いどころ |
|---|---|---|
if 条件 |
条件が真のとき実行 | 基本の条件分岐 |
unless 条件 |
条件が偽のとき実行 | 否定条件・else なし |
処理 if 条件 |
後置 if | 1行で書ける単純な条件 |
処理 unless 条件 |
後置 unless | 早期リターン・スキップ |
unless 条件 else |
使えるが読みづらくなりがち | if else に書き換え推奨 |
unless 条件 elsif |
使えない | if elsif を使う |
Ruby のバージョン確認や環境構築については「Rubyのバージョン管理:rbenv・miseの使い方と切り替え方法」も参照してください。