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 importante: se chiami .unwrap() su un None, il tuo programma andrà in panico 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 in situazioni in cui puoi garantire che Option contenga un valore, ad esempio negli esempi semplici o quando hai già verificato con .is_some().
Sfida
FacileRiceverai due input. Il primo input è un numero (sotto forma di 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 vuoti
- Leggi il secondo input e rimuovi gli spazi vuoti
- 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 sotto forma di 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 (è il comportamento previsto per questa sfida)
Nota: quando il secondo input è invalid, chiamare .unwrap() su None causerà un panic. Questo dimostra quanto possa essere pericoloso usare .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 la stringa in un 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'I cicli come espressioniRiepilogo - Parser di comandi semplice4Raggruppare i dati con le struct
Che cos'è una struct?Panoramica sulle structAccedere ai campi di una structStruct mutabiliLe struct come parametri di funzioneStruct tuplaRiepilogo - Crea una struct Book2Introduzione ai vettori
Che cos'è un vettore?Creare un vettoreAggiungere elementi con pushAccedere agli elementi di un vettoreScorrere un vettoreIterazione mutabileRimuovere elementiRiepilogo - Tracker di punteggi di base5Coppie chiave-valore con le mappe hash
Che cos'è una mappa hash?Creare una mappa hashInserire coppie chiave-valoreAccedere ai valoriIterare su una mappa hashAggiornare un valoreRimuovere una coppiaRiepilogo - Contatore di parole8Progetto: semplice inventario di articoli
Impostazione del progettoAggiungere un articoloControllare le scorteVendere un articoloMettere insieme il tutto3Lista di cose da fare da riga di comando
Impostazione 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