Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Otrzymasz 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, przypisz Some(product_name.to_string())
    • Jeśli status dostępności w magazynie to no, przypisz None
  • 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: yes lub no

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]
    
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Rust online