Menu
Coddy logo textTech

Fornire un valore predefinito: unwrap_or

Fa parte della sezione Logica e flusso del percorso Rust di Coddy. Lezione 40 di 66.

Sebbene .unwrap() e .expect() possano estrarre valori da un Option, entrambi hanno un grave difetto: generano un panic quando incontrano un None. Per scrivere codice più sicuro, Rust fornisce .unwrap_or(), un metodo che non genera mai panic.

Il metodo .unwrap_or() accetta un valore predefinito come argomento. Se Option contiene un Some, restituisce il valore interno. Se è un None, restituisce il valore predefinito che hai fornito:

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

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

Questo approccio è molto più sicuro di .unwrap() perché il tuo programma non andrà mai in crash: otterrai sempre un valore utilizzabile.

challenge icon

Sfida

Facile

Riceverai due input. Il primo input è un punteggio (come numero) e il secondo indica se il punteggio è disponibile (yes) o mancante (no). Crea un Option<i32> in base allo stato di disponibilità. Usa .unwrap_or() per estrarre in sicurezza il punteggio con un valore predefinito di 50, quindi stampa il punteggio finale.

Requisiti:

  • Leggi il primo input (punteggio) e rimuovi gli spazi bianchi
  • Analizza il primo input come i32
  • Leggi il secondo input (stato di disponibilità) e rimuovi gli spazi bianchi
  • Crea una variabile Option<i32>:
    • Se lo stato di disponibilità è yes, assegna Some(score)
    • Se lo stato di disponibilità è no, assegna None
  • Usa .unwrap_or(50) per estrarre il punteggio con un valore predefinito di 50
  • Stampa il punteggio finale nel formato: Final score: [score]

Input:

  • Prima riga: un numero che rappresenta il punteggio (ad es., 85)
  • Seconda riga: yes oppure no

Output:

  • Se lo stato di disponibilità è yes: Final score: [score] (il punteggio effettivo)
  • Se lo stato di disponibilità è no: Final score: 50 (il valore predefinito)

Provalo tu

use std::io;

fn main() {
    // Leggi il punteggio
    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");
    
    // Leggi lo stato di disponibilità
    let mut availability = String::new();
    io::stdin().read_line(&mut availability).expect("Failed to read line");
    let availability = availability.trim();
    
    // TODO: Scrivi il tuo codice qui sotto
    // Crea un Option<i32> in base allo stato di disponibilità
    // Usa .unwrap_or(50) per ottenere il punteggio finale
    
    
    // Stampa il risultato
    println!("Final score: {}", final_score);
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Rust online