Metoda expect
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 39 z 66.
Choć .unwrap() spełnia swoje zadanie, ma poważną wadę: gdy wywołuje panikę w przypadku None, komunikat o błędzie jest ogólny i mało pomocny. Z pomocą przychodzi wtedy .expect().
Metoda .expect() działa dokładnie tak samo jak .unwrap() — wyodrębnia wartość z Some i wywołuje panikę dla None. Kluczowa różnica polega na tym, że .expect() pozwala podać własny komunikat paniki:
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);Jeśli Option zawiera Some, .expect() zwraca wartość wewnętrzną tak jak .unwrap(). Jeśli jednak zawiera None, zamiast ogólnego komunikatu o panice zobaczysz własny komunikat, dzięki czemu znacznie łatwiej będzie zrozumieć, co poszło nie tak i gdzie.
Wyzwanie
ŁatwyOtrzymasz dwa dane wejściowe. Pierwsze to nazwa produktu, a drugie wskazuje, czy produkt jest dostępny w magazynie (yes), czy go nie ma (no). Utwórz wartość Option<String>, która zawiera Some(product_name), jeśli produkt jest dostępny w magazynie, lub None, jeśli go nie ma. Użyj .expect() z opisowym komunikatem, aby pobrać nazwę produktu i ją wypisać.
Wymagania:
- Wczytaj pierwsze dane wejściowe (nazwę produktu) i usuń białe znaki
- Wczytaj drugie dane wejściowe (status dostępności w magazynie) i usuń białe znaki
- Utwórz zmienną typu
Option<String>:- Jeśli status dostępności w magazynie to
yes, przypiszSome(product_name.to_string()) - Jeśli status dostępności w magazynie to
no, przypiszNone
- Jeśli status dostępności w magazynie to
- Użyj
.expect()z komunikatem"Product should be in stock", aby pobrać nazwę produktu - Wypisz pobraną nazwę produktu w formacie:
Product available: [product_name]
Dane wejściowe:
- Pierwszy wiersz: nazwa produktu (np.
Laptop) - Drugi wiersz:
yeslubno
Dane wyjściowe:
- Jeśli status dostępności w magazynie to
yes:Product available: [product_name] - Jeśli status dostępności w magazynie to
no: program zgłosi panikę z własnym komunikatem "Product should be in stock" (jest to oczekiwane zachowanie w tym wyzwaniu)
Uwaga: Gdy status dostępności w magazynie to no, wywołanie .expect() dla None spowoduje panikę z własnym komunikatem. To pokazuje, że .expect() dostarcza bardziej pomocnych informacji o błędzie niż .unwrap().
Spróbuj swoich sił
use std::io;
fn main() {
// Wczytaj nazwę produktu
let mut product_name = String::new();
io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim();
// Wczytaj status dostępności
let mut stock_status = String::new();
io::stdin().read_line(&mut stock_status).expect("Failed to read line");
let stock_status = stock_status.trim();
// TODO: Napisz swój kod poniżej
// Utwórz Option<String> na podstawie stock_status
// Użyj .expect(), aby pobrać nazwę produktu
// Wypisz wynik w formacie: Product available: [product_name]
}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ę Book2Wprowadzenie 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 kod6Obsługa braku wartości za pomocą „Option”
Czym jest „Option”?Używanie „match” z „Option”is_some() i is_none()Rozpakowywanie „Option”Metoda expectPodawanie wartości domyślnej: unwrap_orPodsumowanie – znajdowanie elementuPoćwicz samodzielnie: Kompilator Rust online