ガード節
早期リターンをすっきり記述します。
「ガード節」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。
早期returnで整理する
ガード節とは、メソッドの先頭で無効なケースや例外的なケースを確認し、早期にreturnする処理です。主なロジックを平坦に保ち、読みやすくできます。
def greet(name)
return "Hello, stranger" if name.nil?
"Hello, #{name}"
end
puts greet(nil)
puts greet("Ada")問題:深いネスト
ガードがないと、検証処理がネストしたifブロックとして積み重なります。本来の処理が画面の右端近くまで深く埋もれてしまいます。
def charge(user)
if user
if user[:active]
puts "Charging #{user[:name]}"
end
end
end
charge({ name: "Sam", active: true })解決策:ガード節
各条件を反転させて早期returnします。これで正常系の処理が基準のインデント位置に置かれ、インデントなしで明確に読めるようになります。
def charge(user)
return unless user
return unless user[:active]
puts "Charging #{user[:name]}"
end
charge({ name: "Sam", active: true })値なしのreturn
単独のreturnはメソッドを終了し、nilを返します。拒否したケースで呼び出し側が結果を必要としない場合に使います。
def log(message)
return if message.nil? || message.empty?
puts "LOG: #{message}"
end
log("")
log("started")値を返す
ガードでは、適切なデフォルト値など意味のある値を返すこともできます。これにより、呼び出し側は常に利用できる値を受け取れます。
def discount(price)
return 0 if price <= 0
price * 0.1
end
puts discount(-5)
puts discount(200)unlessによるガード
return unless conditionは、「この要件を満たしていなければ処理を中断する」と読めます。Rubyで非常によく使われる慣用表現の1つです。
def withdraw(balance, amount)
return "Insufficient funds" unless balance >= amount
"New balance: #{balance - amount}"
end
puts withdraw(100, 150)
puts withdraw(100, 40)複数のガード
複数のガードを並べて、入力を1つずつ検証できます。各行が1つのルールを示すため、メソッド自体が説明書のようになります。
def register(name, age)
return "Name required" if name.to_s.empty?
return "Must be 18+" if age < 18
"Registered #{name}"
end
puts register("", 30)
puts register("Lee", 16)
puts register("Lee", 21)ループ内でnextを使うガード
ブロックやループの内部では、1回の反復だけをスキップするためにreturnを使うことはできません。次の項目へ進むガードとしてnextを使います。
[1, -2, 3, -4].each do |n|
next if n.negative?
puts n
endガードで読みやすさを向上させる
下の2つの書き方を頭の中で比べてみてください。ガードを使うとelseをなくし、インデントを減らせます。読み手はまず無効なケースの処理を確認し、その後で中心となるロジックを読めます。
def area(width, height)
return 0 unless width.positive? && height.positive?
width * height
end
puts area(0, 5)
puts area(4, 5)ガードで例外を発生させる
不正な入力が想定されるケースではなくプログラマーのミスである場合は、ガードで例外を発生させて、すぐに明確なエラーにします。
def sqrt(n)
raise ArgumentError, "n must be >= 0" if n.negative?
Math.sqrt(n)
end
puts sqrt(16)
puts sqrt(-1) rescue puts "caught negative input"組み合わせて使う
ガード節は、小さな習慣で大きな効果をもたらします。
- 例外的なケースを最初に処理してreturnします。
- 主なロジックをインデントなしで保ちます。
- 状況に応じて
return、next、raiseを使い分けます。
def initials(name)
return "" if name.nil? || name.strip.empty?
name.split.map { |part| part[0].upcase }.join
end
puts initials(" ").inspect
puts initials("grace hopper")クイックチェック
ガード節についての理解度を確認します。
まとめ
ガード節について学びました。
- 無効なケースや例外的なケースでは早期returnします。
return unlessは、要件が満たされない場合に処理を中断します。- ループの反復をスキップするには
nextを使い、本当のエラーにはraiseを使います。 - その結果、処理が平坦で自己説明的なメソッドになります。
def safe_divide(a, b)
return nil if b.zero?
a / b
end
puts safe_divide(10, 0).inspect
puts safe_divide(10, 2)よくある質問
「ガード節」レッスンは無料ですか?
はい。「ガード節」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。
「ガード節」で何を学びますか?
早期リターンをすっきり記述します。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ruby Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ガード節」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このRuby Academyレッスンでコードを書いて実行できますか?
はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。