Ruby Academy · Lektion

Guard-satser

Tydliga tidiga returer.

Lektion 4 av 413 steg

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
end

Guards 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/raise efter 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 unless avslutar när ett krav inte är uppfyllt.
  • Använd next för att hoppa över en loopiteration och raise fö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)
Gratis att börja

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.

Alla lektioner i den här kursen

  1. if, unless, ternary
  2. case/when-uttryck
  3. Sanningsvärden i Ruby
  4. Guard-satser
← Tillbaka till Ruby Academy