Używanie „match” z „Result”
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 43 z 66.
Teraz, gdy wiesz już, czym jest Result, poznajmy najbardziej przejrzysty i wszechstronny sposób obsługi zarówno przypadków powodzenia, jak i niepowodzenia: użycie wyrażenia match.
Podobnie jak w przypadku Option, match wymusza obsługę obu wariantów Result. Tworzysz jedną gałąź dla Ok, aby obsłużyć powodzenie, i drugą dla Err, aby obsłużyć niepowodzenie:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}Gdy Result ma wartość Ok, wyrażenie match wyodrębnia pomyślną wartość i wykonuje pierwszą gałąź. Gdy ma wartość Err, wyodrębnia informacje o błędzie i wykonuje drugą gałąź. Ten wzorzec gwarantuje, że nigdy przypadkowo nie zignorujesz potencjalnego błędu.
Wyzwanie
ŁatwyOtrzymasz dwa wejścia. Pierwsze wejście to liczba (w postaci ciągu znaków), a drugie wejście to kolejna liczba (w postaci ciągu znaków). Utwórz funkcję, która próbuje podzielić pierwszą liczbę przez drugą i zwraca Result<f64, &'static str>. Jeśli druga liczba wynosi zero, zwróć Err z komunikatem "Division by zero". W przeciwnym razie zwróć Ok z wynikiem dzielenia. Użyj wyrażenia match, aby obsłużyć przypadki Ok i Err, a następnie wypisz odpowiedni komunikat.
Wymagania:
- Odczytaj pierwsze wejście (dzielną) i usuń białe znaki
- Przekonwertuj pierwsze wejście na
f64 - Odczytaj drugie wejście (dzielnik) i usuń białe znaki
- Przekonwertuj drugie wejście na
f64 - Utwórz funkcję, która przyjmuje dwa parametry typu
f64i zwracaResult<f64, &'static str> - Wewnątrz funkcji sprawdź, czy dzielnik ma wartość
0.0:- Jeśli tak, zwróć
Err("Division by zero") - Jeśli nie, zwróć
Ok(dividend / divisor)
- Jeśli tak, zwróć
- Wywołaj funkcję z dwiema przekonwertowanymi liczbami
- Użyj wyrażenia
match, aby obsłużyć wartośćResult - W gałęzi
Ok(value)wypisz:Result: [value] - W gałęzi
Err(error)wypisz:Error: [error]
Wejście:
- Pierwszy wiersz: liczba reprezentująca dzielną (np.
10.0) - Drugi wiersz: liczba reprezentująca dzielnik (np.
2.0)
Wyjście:
- Jeśli dzielenie się powiedzie:
Result: [result] - Jeśli dzielisz przez zero:
Error: Division by zero
Spróbuj swoich sił
use std::io;
// TODO: Utwórz tutaj funkcję divide, która zwraca Result<f64, &'static str>
fn main() {
// Odczytaj pierwszą wartość wejściową (dzielną)
let mut dividend_input = String::new();
io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
// Odczytaj drugą wartość wejściową (dzielnik)
let mut divisor_input = String::new();
io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
// TODO: Wywołaj funkcję divide i użyj match do obsługi Result
// Wypisz "Result: [value]" dla wariantu Ok
// Wypisz "Error: [error]" dla wariantu Err
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Zaawansowane sterowanie przepływem
Wyrażenie „match”Dopasowywanie wielu wartościDopasowywanie zakresówWyrażenie „if let”Pętle jako wyrażeniaPodsumowanie — prosty parser poleceń4Grupowanie danych za pomocą struktur
Czym jest struktura?Przegląd strukturDostęp do pól strukturyModyfikowalne strukturyStruktury jako parametry funkcjiStruktury krotkowePodsumowanie — utwórz strukturę Book7Obsługa błędów za pomocą „Result”
Czym jest „Result”?Używanie „match” z „Result”is_ok() i is_err()Skróty: unwrap i expectOperator znaku zapytania „?”Konwertowanie ciągów znaków na liczbyPodsumowanie — bezpieczna funkcja dzielenia2Wprowadzenie do wektorów
Czym jest wektor?Tworzenie wektoraDodawanie elementów za pomocą pushDostęp do elementów wektoraIterowanie po wektorzeIterowanie z możliwością modyfikacjiUsuwanie elementówPodsumowanie — prosty licznik punktów5Pary klucz–wartość z mapami hashującymi
Czym jest mapa haszująca?Tworzenie mapy haszującejWstawianie par klucz–wartośćDostęp do wartościIterowanie po mapie haszującejAktualizowanie wartościUsuwanie paryPodsumowanie – licznik słów8Projekt: Prosty system inwentaryzacji
Konfiguracja projektuDodawanie produktuSprawdzanie stanu magazynowegoSprzedaż produktuŁączenie wszystkiego w całość3Lista zadań w wierszu poleceń
Konfiguracja projektuDodawanie zadaniaWyświetlanie wszystkich zadańUsuwanie zadaniaKońcowy kodPoćwicz samodzielnie: Kompilator Rust online