後置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らしいコードを書くための重要なイディオム