基礎

Rubyのunless文入門|ifとの違いと使いどころを解説

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を使うのが推奨