Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Otrzymasz 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, przypisz Ok(parsed_number)
    • Jeśli status to error, przypisz Err("Invalid operation")
  • Użyj .expect("Failed to get value"), aby pobrać wartość z Result
  • Wypisz pobraną wartość w formacie: Value: [value]

Wejście:

  • Pierwszy wiersz: liczba (np. 75)
  • Drugi wiersz: ok albo error

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]
    
}
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