Skróty: unwrap i expect
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 45 z 66.
Wiesz już o .unwrap() i .expect() w przypadku Option, a te same metody działają również z Result. Jednak ich działanie nieco się różni w przypadku sukcesu i niepowodzenia.
Metoda .unwrap() wyodrębnia wartość z wariantu Ok, ale jeśli Result ma wartość Err, program wywoła panikę i ulegnie awarii. Podobnie działa metoda .expect(), ale pozwala podać własny komunikat paniki, który ułatwia debugowanie:
let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Wypisuje: Value: 42
// To spowodowałoby panikę z niestandardowym komunikatem:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Powoduje panikę!Chociaż te metody zapewniają szybki dostęp do prawidłowych wartości, należy używać ich ostrożnie. Sprawdzają się najlepiej, gdy masz całkowitą pewność, że operacja zakończy się powodzeniem, lub podczas tworzenia i testowania.
Wyzwanie
ŁatwyOtrzymasz dwa wejścia. Pierwsze wejście to liczba (w postaci ciągu znaków), a drugie to wskaźnik statusu (ok lub error). Utwórz Result<i32, &'static str> na podstawie statusu. Jeśli status to ok, utwórz Ok zawierające sparsowaną liczbę. Jeśli status to error, utwórz Err z komunikatem "Invalid operation". Użyj .expect() z własnym komunikatem, aby pobrać wartość z Result i ją wypisać.
Wymagania:
- Odczytaj pierwsze wejście (liczbę) i usuń białe znaki
- Sparsuj pierwsze wejście jako
i32 - Odczytaj drugie wejście (status) i usuń białe znaki
- Utwórz zmienną
Result<i32, &'static str>:- Jeśli status to
ok, przypiszOk(parsed_number) - Jeśli status to
error, przypiszErr("Invalid operation")
- Jeśli status to
- Użyj
.expect("Failed to get value"), aby pobrać wartość zResult - Wypisz pobraną wartość w formacie:
Value: [value]
Wejście:
- Pierwszy wiersz: liczba (np.
75) - Drugi wiersz:
okalboerror
Wyjście:
- Jeśli status to
ok:Value: [number] - Jeśli status to
error: program wywoła panikę z własnym komunikatem (nie jest to sprawdzane w tym wyzwaniu)
Uwaga: W tym wyzwaniu przypadki testowe będą używać wyłącznie statusu ok, aby zapewnić pomyślne wykonanie. Przypadek error spowodowałby panikę, co jest oczekiwanym zachowaniem .expect() po napotkaniu wartości Err.
Spróbuj swoich sił
use std::io;
fn main() {
// Wczytaj pierwszą wartość wejściową (liczbę)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// Przekształć liczbę na i32
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// Wczytaj drugą wartość wejściową (status)
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: Napisz swój kod poniżej
// Utwórz Result<i32, &'static str> na podstawie status
// Użyj .expect(), aby uzyskać wartość
// Wypisz wynik w formacie: Value: [value]
}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