Guard-satser
Tydliga tidiga returer.
Guard-satser är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Tydliga tidiga returer
En guard clause är en kontroll i början av en metod som returnerar tidigt för ogiltiga fall eller specialfall. Den håller huvudlogiken plan och lättläst.
def greet(name)
return "Hello, stranger" if name.nil?
"Hello, #{name}"
end
puts greet(nil)
puts greet("Ada")Problemet: djup nästling
Utan guard clauses staplas valideringarna i nästlade if-block. Det egentliga arbetet hamnar långt in, längst ut till höger på skärmen.
def charge(user)
if user
if user[:active]
puts "Charging #{user[:name]}"
end
end
end
charge({ name: "Sam", active: true })Lösningen: guard clauses
Vänd på varje villkor och returnera tidigt. Den normala vägen ligger nu på den grundläggande indenteringsnivån, utan extra indrag och tydligt synlig.
def charge(user)
return unless user
return unless user[:active]
puts "Charging #{user[:name]}"
end
charge({ name: "Sam", active: true })return utan värde
Ett ensamt return lämnar metoden och ger nil. Använd det när anroparen inte behöver något resultat för det avvisade fallet.
def log(message)
return if message.nil? || message.empty?
puts "LOG: #{message}"
end
log("")
log("started")Returnera ett värde
En guard clause kan också returnera ett meningsfullt värde, till exempel ett lämpligt standardvärde, så att anroparna alltid får något användbart.
def discount(price)
return 0 if price <= 0
price * 0.1
end
puts discount(-5)
puts discount(200)Guard med unless
return unless condition kan läsas som ”avsluta om detta krav inte är uppfyllt”. Det är ett av de vanligaste Ruby-idiomen.
def withdraw(balance, amount)
return "Insufficient funds" unless balance >= amount
"New balance: #{balance - amount}"
end
puts withdraw(100, 150)
puts withdraw(100, 40)Flera guard clauses
Stapla flera guard clauses för att validera indata steg för steg. Varje rad uttrycker en enda regel, vilket gör metoden självförklarande.
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)Guards med next i loopar
Inuti ett block eller en loop kan ni inte använda return för att bara lämna en iteration. Använd next som guard för att hoppa till nästa objekt.
[1, -2, 3, -4].each do |n|
next if n.negative?
puts n
endGuards förbättrar läsbarheten
Jämför de två stilarna nedan i tankarna: guards tar bort else och minskar indenteringen. Läsaren ser att ogiltiga fall hanteras först och därefter kärnlogiken.
def area(width, height)
return 0 unless width.positive? && height.positive?
width * height
end
puts area(0, 5)
puts area(4, 5)Kasta ett undantag i en guard
När felaktig indata beror på ett programmeringsfel och inte är ett förväntat fall bör ni kasta ett undantag i guarden, så att felet upptäcks snabbt och tydligt.
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"Sätt ihop delarna
Guard clauses är en liten vana som ger stor utdelning:
- Hantera specialfall direkt och returnera.
- Håll huvudlogiken utan extra indrag.
- Använd
return/next/raiseefter situationens krav.
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")Snabb kontroll
Testa er förståelse av guard clauses.
Sammanfattning
Ni har lärt er om guard clauses:
- Returnera tidigt för ogiltiga fall eller specialfall.
return unlessavslutar när ett krav inte är uppfyllt.- Använd
nextför att hoppa över en loopiteration ochraiseför verkliga fel. - Resultatet blir plana, självförklarande metoder.
def safe_divide(a, b)
return nil if b.zero?
a / b
end
puts safe_divide(10, 0).inspect
puts safe_divide(10, 2)Lär dig Ruby med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 29
- Lektioner
- 109
Vanliga frågor
Är lektionen ”Guard-satser” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Guard-satser”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Guard-satser”?
Tydliga tidiga returer. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?
Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Guard-satser”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Ruby Academy-lektionen?
Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.