Skróty: unwrap i expect
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 45 z 66.
Masz już za sobą naukę o .unwrap() i .expect() w przypadku Option, a te same metody działają również z Result. Ich zachowanie jest jednak nieco inne w przypadku sukcesu i niepowodzenia.
Metoda .unwrap() wyodrębnia wartość z wariantu Ok, ale jeśli Result jest wariantem Err, program ulegnie panice i zakończy działanie. Podobnie działa .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. Najlepiej sprawdzają się, gdy masz całkowitą pewność, że operacja się powiedzie, lub podczas programowania i testowania.
Wyzwanie
ŁatwyOtrzymasz dwa dane wejściowe. Pierwsze dane wejściowe to liczba (zapisana jako ciąg 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 dane wejściowe (liczbę) i usuń białe znaki
- Sparsuj pierwsze dane wejściowe do typu
i32 - Odczytaj drugie dane wejściowe (status) i usuń białe znaki
- Utwórz zmienną typu
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]
Dane wejściowe:
- Pierwszy wiersz: liczba (np.
75) - Drugi wiersz:
okluberror
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 testowane 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() w przypadku napotkania Err.
Spróbuj swoich sił
use std::io;
fn main() {
// Wczytaj pierwsze dane wejściowe (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();
// Przekonwertuj liczbę na i32
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// Wczytaj drugie dane wejściowe (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 wyodrębnić 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