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().
Sfida
FacileRiceverai 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
i32usando.parse::<i32>() - Crea una variabile
Option<i32>:- Se il secondo input è
valid, assegnaSome(parsed_number) - Se il secondo input è
invalid, assegnaNone
- Se il secondo input è
- Usa
.unwrap()per estrarre il valore daOption - Stampa il valore estratto nel formato:
Value: [number]
Input:
- Prima riga: un numero come stringa (ad es.,
42) - Seconda riga:
validoppureinvalid
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]
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
L'espressione 'match'Corrispondenza di più valoriCorrispondenza di intervalliL'espressione 'if let'Cicli come espressioniRipasso - Parser di comandi semplice4Raggruppare i dati con le struct
Che cos'è una struct?Panoramica sulle structAccedere ai campi delle structStruct mutabiliStruct come parametri di funzioneStruct tuplaRiepilogo - Creare una struct Book2Introduzione ai vettori
Che cos'è un vettore?Creare un vettoreAggiungere elementi con pushAccedere agli elementi di un vettoreIterare su un vettoreIterazione mutabileRimuovere elementiRiepilogo - Tracker dei punteggi di base5Coppie chiave-valore con mappe hash
Che cos'è una mappa hash?Creare una mappa hashInserire coppie chiave-valoreAccedere ai valoriScorrere una mappa hashAggiornare un valoreRimuovere una coppiaRiepilogo - Contatore di parole8Progetto: inventario semplice degli articoli
Configurazione del progettoAggiungere un articoloControllare le scorteVendere un articoloMettere tutto insieme3Lista di attività da riga di comando
Configurazione del progettoAggiungere un'attivitàVisualizzare tutte le attivitàRimuovere un'attivitàCodice finale6Gestire l'assenza con 'Option'
Che cos'è un 'Option'?Usare 'match' con 'Option'is_some() e is_none()Estrarre il valore da un 'Option'Il metodo expectFornire un valore predefinito: unwrap_orRiepilogo - Trovare un elementoEsercitati da solo: Compilatore Rust online