Menu
Coddy logo textTech

Podawanie wartości domyślnej: unwrap_or

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

Chociaż .unwrap() i .expect() mogą pobierać wartości z Option, obie metody mają poważną wadę: powodują panikę po napotkaniu wartości None. Aby pisać bezpieczniejszy kod, Rust udostępnia .unwrap_or() — metodę, która nigdy nie powoduje paniki.

Metoda .unwrap_or() przyjmuje wartość domyślną jako argument. Jeśli Option zawiera Some, zwraca wartość wewnętrzną. Jeśli zawiera None, zwraca podaną przez Ciebie wartość domyślną:

let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // Wypisuje: Score: 85

let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // Wypisuje: Score: 0

To podejście jest znacznie bezpieczniejsze niż .unwrap(), ponieważ program nigdy się nie zawiesi — zawsze otrzymasz użyteczną wartość.

challenge icon

Wyzwanie

Łatwy

Otrzymasz dwa dane wejściowe. Pierwsze to wynik (jako liczba), a drugie wskazuje, czy wynik jest dostępny (yes), czy go brakuje (no). Utwórz Option<i32> na podstawie informacji o dostępności. Użyj .unwrap_or(), aby bezpiecznie pobrać wynik z domyślną wartością 50, a następnie wypisz końcowy wynik.

Wymagania:

  • Odczytaj pierwsze dane wejściowe (wynik) i usuń białe znaki
  • Przekonwertuj pierwsze dane wejściowe na i32
  • Odczytaj drugie dane wejściowe (informację o dostępności) i usuń białe znaki
  • Utwórz zmienną typu Option<i32>:
    • Jeśli wynik jest dostępny (yes), przypisz Some(score)
    • Jeśli wynik nie jest dostępny (no), przypisz None
  • Użyj .unwrap_or(50), aby pobrać wynik z domyślną wartością 50
  • Wypisz końcowy wynik w formacie: Final score: [score]

Dane wejściowe:

  • Pierwszy wiersz: Liczba oznaczająca wynik (np. 85)
  • Drugi wiersz: yes lub no

Wynik:

  • Jeśli wynik jest dostępny (yes): Final score: [score] (rzeczywisty wynik)
  • Jeśli wynik nie jest dostępny (no): Final score: 50 (wartość domyślna)

Spróbuj swoich sił

use std::io;

fn main() {
    // Wczytaj wynik
    let mut score_input = String::new();
    io::stdin().read_line(&mut score_input).expect("Failed to read line");
    let score: i32 = score_input.trim().parse().expect("Invalid number");
    
    // Wczytaj status dostępności
    let mut availability = String::new();
    io::stdin().read_line(&mut availability).expect("Failed to read line");
    let availability = availability.trim();
    
    // TODO: Napisz swój kod poniżej
    // Utwórz Option<i32> na podstawie statusu dostępności
    // Użyj .unwrap_or(50), aby uzyskać wynik końcowy
    
    
    // Wyświetl wynik
    println!("Final score: {}", final_score);
}
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