Menu
Coddy logo textTech

Estrarre il valore da un 'Option'

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

A volte devi estrarre il valore effettivo da un Option quando sei sicuro che contenga un Some. Rust fornisce il metodo .unwrap() a questo scopo: estrae il valore da un Some e te lo restituisce direttamente.

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

Quando chiami .unwrap() su un Some(value), restituisce il valore interno. Nell’esempio precedente, actual_number diventa 42 - non è più racchiuso in un Option.

Tuttavia, c'è un avvertimento fondamentale: se chiami .unwrap() su un None, il tuo programma andrà in panic e si arresterà immediatamente. Questo rende .unwrap() un metodo potenzialmente pericoloso, da usare solo quando sei assolutamente certo che Option contenga un Some.

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Questo causerà un panic!

Usa .unwrap() con parsimonia e solo nelle situazioni in cui puoi garantire che Option contenga un valore, per esempio negli esempi semplici o quando hai già verificato con .is_some().

challenge icon

Sfida

Facile

Riceverai due input. Il primo input è un numero (come stringa) e il secondo indica se questo numero deve essere considerato valido o non valido. Se il secondo input è valid, crea un Option<i32> contenente Some con il numero analizzato. Se il secondo input è invalid, crea un Option<i32> contenente None. Usa .unwrap() per estrarre il valore da Option e stamparlo.

Requisiti:

  • Leggi il primo input e rimuovi gli spazi bianchi
  • Leggi il secondo input e rimuovi gli spazi bianchi
  • Analizza il primo input come i32 usando .parse::<i32>()
  • Crea una variabile Option<i32>:
    • Se il secondo input è valid, assegna Some(parsed_number)
    • Se il secondo input è invalid, assegna None
  • Usa .unwrap() per estrarre il valore da Option
  • Stampa il valore estratto nel formato: Value: [number]

Input:

  • Prima riga: un numero come stringa (ad es., 42)
  • Seconda riga: valid oppure invalid

Output:

  • Se il secondo input è valid: Value: [number]
  • Se il secondo input è invalid: il programma andrà in panic (comportamento previsto per questa sfida)

Nota: Quando il secondo input è invalid, chiamare .unwrap() su None causerà un panic. Questo dimostra la natura pericolosa di .unwrap() quando non si è certi che Option contenga un valore.

Provalo tu

use std::io;

fn main() {
    // Leggi il primo input (numero come stringa)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Leggi il secondo input (valido o non valido)
    let mut validity_input = String::new();
    io::stdin().read_line(&mut validity_input).expect("Failed to read line");
    let validity_input = validity_input.trim();
    
    // Converti il numero
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // TODO: Scrivi il tuo codice qui sotto
    // Crea un Option<i32> in base a validity_input
    // Se validity_input è "valid", assegna Some(parsed_number)
    // Se validity_input è "invalid", assegna None
    // Poi usa .unwrap() per estrarre il valore e stamparlo nel formato: Value: [number]
    
}
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