Menu
Coddy logo textTech

Rozpakowywanie „Option”

Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 38 z 66.

Czasami trzeba wyodrębnić rzeczywistą wartość z Option, gdy masz pewność, że zawiera Some. Rust udostępnia do tego celu metodę .unwrap() — wyjmuje ona wartość z Some i zwraca ją bezpośrednio.

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);

Gdy wywołasz .unwrap() na Some(value), zwróci ono wewnętrzną wartość. W powyższym przykładzie actual_number staje się 42 — nie jest już opakowane w Option.

Jest jednak ważne ostrzeżenie: jeśli wywołasz .unwrap() na wartości None, Twój program natychmiast wpadnie w panikę i ulegnie awarii. To sprawia, że .unwrap() jest potencjalnie niebezpieczną metodą, której należy używać tylko wtedy, gdy masz całkowitą pewność, że Option zawiera wartość Some.

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // To spowoduje panikę!

Używaj .unwrap() oszczędnie i tylko w sytuacjach, w których możesz zagwarantować, że Option zawiera wartość, na przykład w prostych przykładach lub gdy wcześniej sprawdzisz za pomocą .is_some().

challenge icon

Wyzwanie

Łatwy

Otrzymasz dwa wejścia. Pierwsze wejście to liczba (jako ciąg znaków), a drugie wskazuje, czy tę liczbę należy traktować jako prawidłową czy nieprawidłową. Jeśli drugie wejście to valid, utwórz Option<i32> zawierające Some z sparsowaną liczbą. Jeśli drugie wejście to invalid, utwórz Option<i32> zawierające None. Użyj .unwrap(), aby pobrać wartość z Option i ją wypisać.

Wymagania:

  • Odczytaj pierwsze wejście i usuń białe znaki
  • Odczytaj drugie wejście i usuń białe znaki
  • Parsuj pierwsze wejście do typu i32, używając .parse::<i32>()
  • Utwórz zmienną typu Option<i32>:
    • Jeśli drugie wejście to valid, przypisz Some(parsed_number)
    • Jeśli drugie wejście to invalid, przypisz None
  • Użyj .unwrap(), aby pobrać wartość z Option
  • Wypisz pobraną wartość w formacie: Value: [number]

Wejście:

  • Pierwszy wiersz: liczba jako ciąg znaków (np. 42)
  • Drugi wiersz: valid albo invalid

Wyjście:

  • Jeśli drugie wejście to valid: Value: [number]
  • Jeśli drugie wejście to invalid: program wywoła panikę (jest to oczekiwane zachowanie w tym wyzwaniu)

Uwaga: Gdy drugie wejście to invalid, wywołanie .unwrap() na None spowoduje panikę. Pokazuje to niebezpieczny charakter .unwrap(), gdy nie masz pewności, że Option zawiera wartość.

Spróbuj swoich sił

use std::io;

fn main() {
    // Odczytaj pierwszą wartość wejściową (liczbę jako ciąg znaków)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Odczytaj drugą wartość wejściową (poprawną lub niepoprawną)
    let mut validity_input = String::new();
    io::stdin().read_line(&mut validity_input).expect("Failed to read line");
    let validity_input = validity_input.trim();
    
    // Przekształć ciąg znaków w liczbę
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // TODO: Napisz swój kod poniżej
    // Utwórz Option<i32> na podstawie validity_input
    // Jeśli validity_input ma wartość "valid", przypisz Some(parsed_number)
    // Jeśli validity_input ma wartość "invalid", przypisz None
    // Następnie użyj .unwrap(), aby wydobyć wartość i wypisać ją w formacie: Value: [number]
    
}
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