unless文はif文の逆で、条件が偽のときに処理を実行する制御構文です。「〜でなければ」という否定条件を自然に表現でき、Rubyらしい読みやすいコードを書くことができます。この記事ではunless文の基本から、if文との使い分け方まで詳しく解説します。
基本的な使い方
unless文は条件が偽(false)のときにブロック内の処理を実行します。if文に!(否定)を付けるのと同じ意味ですが、より自然な英語に近い表現になります。
Ruby
is_holiday = false
unless is_holiday
puts '今日は仕事の日です'
end実行結果
今日は仕事の日です上記のコードは「is_holidayが偽でなければ」、つまり「休日でなければ」仕事の日ですと出力します。同じ処理をif文で書くとif !is_holidayとなりますが、unless文の方が否定の意図がわかりやすくなります。
unless-else文
unless文にもelseを付けることができます。
Ruby
logged_in = false
unless logged_in
puts 'ログインしてください'
else
puts 'ようこそ!'
end実行結果
ログインしてくださいただし、unless-elseは読みにくくなりがちです。elseが必要な場合はif-elseを使った方が明確です。
ifとunlessの比較
同じ処理をif文とunless文で書き比べてみましょう。
Ruby
is_empty = true
# if文で否定条件
if !is_empty
puts 'データがあります(if版)'
end
# unless文(より自然)
unless is_empty
puts 'データがあります(unless版)'
end
# 今回はis_emptyがtrueなので、どちらも実行されない
puts '---'
is_empty = false
if !is_empty
puts 'データがあります(if版)'
end
unless is_empty
puts 'データがあります(unless版)'
end実行結果
---
データがあります(if版)
データがあります(unless版)後置unless
1行で書ける場合は、処理の後ろにunlessを置く「後置unless」が使えます。
Ruby
age = 15
puts '入場できません' unless age >= 18
puts '---'
age = 20
puts '入場できません' unless age >= 18
puts '入場OK' if age >= 18実行結果
入場できません
---
入場OK後置unlessは短い条件分岐をシンプルに書けるため、ガード節(早期リターン)などでよく使われます。
実践的な使い方
Ruby
# バリデーション処理でのunlessの活用
def validate_user(name, email)
errors = []
errors << '名前を入力してください' unless name && !name.empty?
errors << 'メールアドレスを入力してください' unless email && !email.empty?
errors << 'メールアドレスの形式が正しくありません' unless email&.include?('@')
if errors.empty?
puts "#{name}さん、登録完了です!"
else
puts 'エラー:'
errors.each { |e| puts " - #{e}" }
end
end
validate_user('太郎', 'taro@example.com')
puts '---'
validate_user('', nil)実行結果
太郎さん、登録完了です!
---
エラー:
- 名前を入力してください
- メールアドレスを入力してください
- メールアドレスの形式が正しくありませんunlessの使いどころ
unlessはシンプルな否定条件のときに使います。「〜でない場合」「〜がなければ」という条件を自然に表現したい場面に最適です。条件が複雑な場合(&&や||を使う場合)はif文の方が読みやすくなります。
unless-elsifは使えない
unlessにはelsifを付けることができません。複数条件の分岐が必要な場合はif-elsif-else文を使いましょう。また、unless-elseも二重否定のように読みにくくなるため、if-elseの方が推奨されます。
まとめ
unlessは条件が偽のときに処理を実行する(ifの逆)- シンプルな否定条件は
unlessで書くと自然で読みやすい - 後置unlessで1行にまとめて書くこともできる
unless-elsifは使えない。複雑な条件分岐にはif文を使うunless-elseは読みにくいため、if-elseを使うのが推奨