基礎

Rubyの後置if入門|1行で条件分岐を書くテクニック

後置if(if修飾子)は、条件分岐を1行で簡潔に書くためのRubyの構文です。通常のif文は複数行にまたがりますが、後置ifは処理 if 条件の形で1行に収められます。ガード節(早期リターン)やシンプルな条件分岐で多用され、コードの可読性を高めるRubyらしい書き方です。

基本的な使い方

後置ifは実行する処理 if 条件式の形式で書きます。

Ruby
# 通常のif文
age = 20
if age >= 18
  puts '成人です'
end

# 後置if(同じ意味を1行で書く)
puts '成人です' if age >= 18
実行結果
成人です
成人です

条件が真のときだけ処理が実行されます。条件が偽の場合は何も起こりません。通常のif文と全く同じ動作ですが、1行で書けるためシンプルなケースに適しています。

さまざまな条件式

Ruby
name = '太郎'
score = 85
items = ['りんご', 'バナナ']

puts "こんにちは、#{name}さん" if name
puts '合格!' if score >= 60
puts '配列にデータあり' if items.any?
puts '空です' if items.empty?  # 条件が偽なので実行されない
実行結果
こんにちは、太郎さん
合格!
配列にデータあり

ガード節(早期リターン)

後置ifが最も活躍するのはメソッドの先頭でのガード節です。前提条件を満たさない場合に早期にリターンすることで、ネストを浅くして読みやすいコードにできます。

Ruby
# ガード節なし(ネストが深い)
def process_order_bad(item, quantity)
  if item
    if quantity > 0
      puts "#{item}を#{quantity}個注文しました"
    else
      puts 'エラー: 数量は1以上にしてください'
    end
  else
    puts 'エラー: 商品を指定してください'
  end
end

# ガード節あり(フラットで読みやすい)
def process_order(item, quantity)
  return puts 'エラー: 商品を指定してください' if item.nil?
  return puts 'エラー: 数量は1以上にしてください' if quantity <= 0

  puts "#{item}を#{quantity}個注文しました"
end

process_order('ノートPC', 2)
process_order(nil, 1)
process_order('マウス', 0)
実行結果
ノートPCを2個注文しました
エラー: 商品を指定してください
エラー: 数量は1以上にしてください

ガード節を使ったコードは、異常系の処理を先に片付けて、正常系の処理をメソッドの最後にフラットに書けます。ネストが浅くなり、コードの流れが理解しやすくなります。

後置unlessとの組み合わせ

Ruby
logged_in = false
admin = true

puts 'ログインしてください' unless logged_in
puts '管理者メニューを表示' if admin
puts '一般メニューを表示' unless admin  # 条件が偽なので実行されない
実行結果
ログインしてください
管理者メニューを表示

実践的な使い方

Ruby
class User
  attr_reader :name, :age, :email

  def initialize(name, age, email)
    @name = name
    @age = age
    @email = email
  end

  def validate
    errors = []
    errors << '名前が未入力' if name.to_s.strip.empty?
    errors << '年齢が不正' if age.nil? || age < 0
    errors << 'メールが未入力' if email.to_s.strip.empty?
    errors << 'メールに@がない' if email && !email.include?('@')
    errors
  end

  def save
    errs = validate
    return puts "保存失敗: #{errs.join(', ')}" if errs.any?

    puts "#{name}のデータを保存しました"
  end
end

User.new('太郎', 25, 'taro@example.com').save
User.new('', 25, 'invalid').save
User.new('花子', -1, '').save
実行結果
太郎のデータを保存しました
保存失敗: 名前が未入力, メールに@がない
保存失敗: 年齢が不正, メールが未入力, メールに@がない

変数代入と後置if

Ruby
# 条件付き代入
discount = 0
vip = true

discount = 500 if vip
puts "割引: #{discount}円"

# メソッド呼び出しにも使える
numbers = [3, 1, 4, 1, 5]
numbers.sort! if numbers.length > 1
puts numbers.inspect
実行結果
割引: 500円
[1, 1, 3, 4, 5]
後置ifを使うべき場面

後置ifは1つの処理を条件付きで実行する場合に使います。処理が1行に収まるシンプルなケースに限定し、処理が長い場合や複雑な条件の場合は通常のif文を使いましょう。ガード節は後置ifの最も効果的な使い方です。

複雑な処理には使わない

後置ifに長い処理や複雑な条件式を書くと、かえって読みにくくなります。1行が80文字を超えるような場合は通常のif文に戻しましょう。後置ifは「簡潔さ」が目的であり、無理に1行にまとめる必要はありません。

まとめ

  • 処理 if 条件の形式でシンプルな条件分岐を1行で書ける
  • ガード節(早期リターン)で使うとコードのネストを減らせる
  • 後置unlessも同様に処理 unless 条件で書ける
  • 複雑な処理や長い条件式には通常のif文を使う
  • Rubyらしいコードを書くための重要なイディオム