Menu
CoddyTech

Scorciatoie: unwrap ed expect

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

Hai già imparato a conoscere .unwrap() e .expect() con Option, e questi stessi metodi funzionano anche con Result. Tuttavia, il loro comportamento è leggermente diverso nei casi di successo e di errore.

Il metodo .unwrap() estrae il valore da una variante Ok, ma se il Result è un Err, il programma andrà in panico e si arresterà. Analogamente, .expect() fa la stessa cosa, ma ti permette di fornire un messaggio di panico personalizzato che rende più semplice il debug:

let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Stampa: Value: 42

// Questo causerebbe un panic con il messaggio personalizzato:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Causa un panic!

Sebbene questi metodi consentano di accedere rapidamente ai valori corretti, è consigliabile usarli con cautela. Sono più adatti quando si è assolutamente certi che l'operazione avrà successo, oppure durante lo sviluppo e i test.

challenge icon

Sfida

Facile

Riceverai due input. Il primo input è un numero (sotto forma di stringa) e il secondo è un indicatore di stato (ok o error). Crea un Result<i32, &'static str> in base allo stato. Se lo stato è ok, crea un Ok contenente il numero analizzato. Se lo stato è error, crea un Err con il messaggio "Invalid operation". Usa .expect() con un messaggio personalizzato per estrarre il valore da Result e stamparlo.

Requisiti:

  • Leggi il primo input (numero) e rimuovi gli spazi bianchi
  • Analizza il primo input come i32
  • Leggi il secondo input (stato) e rimuovi gli spazi bianchi
  • Crea una variabile Result<i32, &'static str>:
    • Se lo stato è ok, assegna Ok(parsed_number)
    • Se lo stato è error, assegna Err("Invalid operation")
  • Usa .expect("Failed to get value") per estrarre il valore da Result
  • Stampa il valore estratto nel formato: Value: [value]

Input:

  • Prima riga: un numero (ad es., 75)
  • Seconda riga: ok oppure error

Output:

  • Se lo stato è ok: Value: [number]
  • Se lo stato è error: il programma andrà in panic con il messaggio personalizzato (non viene verificato in questa sfida)

Nota: per questa sfida, i casi di test useranno solo lo stato ok per garantire un'esecuzione corretta. Il caso error causerebbe un panic, comportamento previsto di .expect() quando incontra un Err.

Provalo tu

use std::io;

fn main() {
    // Leggi il primo input (numero)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Converti il numero in i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // Leggi il secondo input (stato)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO: Scrivi il tuo codice qui sotto
    // Crea un Result<i32, &'static str> in base allo stato
    // Usa .expect() per estrarre il valore
    // Stampa il risultato nel formato: Value: [value]
    
}
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