Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Otrzymasz 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, 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]

Dane wejściowe:

  • Pierwszy wiersz: liczba (np. 75)
  • Drugi wiersz: ok lub 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 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]
    
}
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