Klauzule ochronne
Czytelne wcześniejsze zwroty
Klauzule ochronne to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Czyste wcześniejsze zwroty
Klauzula ochronna to sprawdzenie na początku metody, które kończy jej działanie wcześniej w przypadku nieprawidłowych danych lub sytuacji brzegowych. Dzięki niej główna logika pozostaje płaska i łatwa do odczytania.
def greet(name)
return "Hello, stranger" if name.nil?
"Hello, #{name}"
end
puts greet(nil)
puts greet("Ada")Problem: głębokie zagnieżdżenie
Bez klauzul ochronnych walidacje nakładają się w zagnieżdżonych blokach if. Właściwa logika zostaje zakopana głęboko przy prawej krawędzi ekranu.
def charge(user)
if user
if user[:active]
puts "Charging #{user[:name]}"
end
end
end
charge({ name: "Sam", active: true })Rozwiązanie: klauzule ochronne
Odwróć każdy warunek i zakończ działanie wcześniej. Ścieżka pomyślna znajduje się teraz na podstawowym poziomie wcięcia, bez dodatkowego wcięcia i jest oczywista.
def charge(user)
return unless user
return unless user[:active]
puts "Charging #{user[:name]}"
end
charge({ name: "Sam", active: true })return bez wartości
Samodzielne return kończy metodę i zwraca nil. Używaj go, gdy wywołujący nie potrzebuje wyniku w odrzuconym przypadku.
def log(message)
return if message.nil? || message.empty?
puts "LOG: #{message}"
end
log("")
log("started")Zwracanie wartości
Klauzula ochronna może również zwracać znaczącą wartość, na przykład rozsądną wartość domyślną, dzięki czemu wywołujący zawsze otrzymuje coś użytecznego.
def discount(price)
return 0 if price <= 0
price * 0.1
end
puts discount(-5)
puts discount(200)Klauzula ochronna z unless
return unless condition można odczytać jako „przerwij działanie, jeśli ten warunek nie jest spełniony”. To jeden z najczęściej używanych idiomów Ruby.
def withdraw(balance, amount)
return "Insufficient funds" unless balance >= amount
"New balance: #{balance - amount}"
end
puts withdraw(100, 150)
puts withdraw(100, 40)Wiele klauzul ochronnych
Układaj kilka klauzul ochronnych jedna po drugiej, aby sprawdzać dane wejściowe krok po kroku. Każdy wiersz wyraża jedną regułę, dzięki czemu metoda sama się dokumentuje.
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)Klauzule ochronne z next w pętlach
Wewnątrz bloku lub pętli nie możesz użyć return, aby pominąć tylko jedną iterację. Użyj next jako klauzuli ochronnej, aby przejść do następnego elementu.
[1, -2, 3, -4].each do |n|
next if n.negative?
puts n
endKlauzule ochronne zwiększają czytelność
Porównaj w myślach oba style przedstawione poniżej: klauzule ochronne usuwają else i zmniejszają poziom wcięcia. Czytelnik widzi najpierw obsługę nieprawidłowych przypadków, a następnie główną logikę.
def area(width, height)
return 0 unless width.positive? && height.positive?
width * height
end
puts area(0, 5)
puts area(4, 5)Zgłaszanie wyjątku w klauzuli ochronnej
Gdy nieprawidłowe dane wejściowe są błędem programisty, a nie oczekiwanym przypadkiem, zgłoś wyjątek w klauzuli ochronnej, aby szybko i wyraźnie przerwać działanie.
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"Połączenie wszystkiego
Klauzule ochronne to niewielki nawyk, który przynosi duże korzyści:
- Obsługuj przypadki brzegowe na początku i kończ działanie.
- Utrzymuj główną logikę bez dodatkowego wcięcia.
- Używaj
return/next/raisezależnie od sytuacji.
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")Szybki test
Sprawdź swoją wiedzę na temat klauzul ochronnych.
Podsumowanie
Poznałeś klauzule ochronne:
- Kończ działanie wcześniej w przypadku nieprawidłowych danych lub sytuacji brzegowych.
return unlesskończy działanie, gdy wymaganie nie jest spełnione.- Używaj
next, aby pominąć iterację pętli, araisew przypadku rzeczywistych błędów. - Rezultatem są płaskie metody, które same się dokumentują.
def safe_divide(a, b)
return nil if b.zero?
a / b
end
puts safe_divide(10, 0).inspect
puts safe_divide(10, 2)Często zadawane pytania
Czy lekcja „Klauzule ochronne” jest bezpłatna?
Tak — pełny tekst „Klauzule ochronne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Klauzule ochronne”?
Czytelne wcześniejsze zwroty Ćwiczysz Ruby Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Ruby Academy?
Nie wymagamy żadnego doświadczenia. Ruby Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Klauzule ochronne”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Ruby Academy?
Tak. Każda lekcja Ruby Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- if, unless, ternary
- Wyrażenia case/when
- Prawdziwość w Ruby
- Klauzule ochronne