Clausole di guardia
Return anticipati e chiari
Clausole di guardia è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.
Ritorni anticipati chiari
Una clausola di guardia è un controllo all'inizio di un metodo che termina subito in caso di input non validi o casi limite. Mantiene la logica principale lineare e facile da leggere.
def greet(name)
return "Hello, stranger" if name.nil?
"Hello, #{name}"
end
puts greet(nil)
puts greet("Ada")Il problema: annidamento profondo
Senza clausole di guardia, le validazioni si accumulano in blocchi if annidati. Il lavoro vero finisce sepolto in profondità, sul margine destro dello schermo.
def charge(user)
if user
if user[:active]
puts "Charging #{user[:name]}"
end
end
end
charge({ name: "Sam", active: true })La soluzione: clausole di guardia
Inverta ogni condizione e termini subito l'esecuzione. Il percorso principale si trova ora al livello base di indentazione, senza rientri e immediatamente visibile.
def charge(user)
return unless user
return unless user[:active]
puts "Charging #{user[:name]}"
end
charge({ name: "Sam", active: true })return senza valore
Un return senza argomenti esce dal metodo e restituisce nil. Lo utilizzi quando il chiamante non ha bisogno di un risultato per il caso rifiutato.
def log(message)
return if message.nil? || message.empty?
puts "LOG: #{message}"
end
log("")
log("started")Restituire un valore
Una clausola di guardia può anche restituire un valore significativo, ad esempio un valore predefinito sensato, così i chiamanti ricevono sempre qualcosa di utilizzabile.
def discount(price)
return 0 if price <= 0
price * 0.1
end
puts discount(-5)
puts discount(200)Clausole di guardia con unless
return unless condition si legge come «termini l'esecuzione se questo requisito non è soddisfatto». È uno degli idiomi Ruby più comuni.
def withdraw(balance, amount)
return "Insufficient funds" unless balance >= amount
"New balance: #{balance - amount}"
end
puts withdraw(100, 150)
puts withdraw(100, 40)Clausole di guardia multiple
Imposti più clausole di guardia una dopo l'altra per convalidare gli input singolarmente. Ogni riga esprime una sola regola, rendendo il metodo autoesplicativo.
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)Clausole di guardia con next nei cicli
All'interno di un blocco o di un ciclo non può utilizzare return per saltare una sola iterazione. Utilizzi next come clausola di guardia per passare all'elemento successivo.
[1, -2, 3, -4].each do |n|
next if n.negative?
puts n
endLe clausole di guardia migliorano la leggibilità
Confronti mentalmente i due stili qui sotto: le clausole di guardia eliminano l'else e riducono l'indentazione. Chi legge vede prima la gestione dei casi non validi e poi la logica principale.
def area(width, height)
return 0 unless width.positive? && height.positive?
width * height
end
puts area(0, 5)
puts area(4, 5)Sollevare un'eccezione in una clausola di guardia
Quando un input errato indica un errore del programmatore anziché un caso previsto, sollevi un'eccezione nella clausola di guardia per interrompere l'esecuzione subito e in modo evidente.
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"Riunire il tutto
Le clausole di guardia sono una piccola abitudine dai grandi vantaggi:
- Gestisca subito i casi limite e restituisca il risultato.
- Mantenga la logica principale senza rientri.
- Utilizzi
return/next/raisein base alla situazione.
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")Verifica rapida
Verifichi la sua comprensione delle clausole di guardia.
Riepilogo
Ha imparato a utilizzare le clausole di guardia:
- Restituisca subito il risultato per i casi non validi o limite.
return unlessinterrompe l'esecuzione quando un requisito non è soddisfatto.- Utilizzi
nextper saltare un'iterazione del ciclo eraiseper gli errori reali. - Il risultato sono metodi lineari e autoesplicativi.
def safe_divide(a, b)
return nil if b.zero?
a / b
end
puts safe_divide(10, 0).inspect
puts safe_divide(10, 2)Domande Frequenti
La lezione «Clausole di guardia» è gratuita?
Sì — il testo completo di «Clausole di guardia» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.
Cosa imparerò in «Clausole di guardia»?
Return anticipati e chiari Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Ruby Academy?
Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Clausole di guardia»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Ruby Academy?
Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- if, unless, ternary
- Espressioni case/when
- Valori di verità in Ruby
- Clausole di guardia