Menu
Coddy logo textTech

Atajos: unwrap y expect

Parte de la sección Logic & Flow del Journey de Rust de Coddy — lección 45 de 66.

Ya has aprendido sobre .unwrap() y .expect() con Option, y estos mismos métodos funcionan con Result también. Sin embargo, su comportamiento es ligeramente diferente cuando se trata de casos de éxito y error.

El método .unwrap() extrae el valor de una variante Ok, pero si el Result es un Err, tu programa entrará en pánico y fallará. De manera similar, .expect() hace lo mismo pero te permite proporcionar un mensaje de pánico personalizado que facilita la depuración:

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

// Esto entraría en pánico con el mensaje personalizado:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // ¡Entra en pánico!

Si bien estos métodos proporcionan un acceso rápido a los valores exitosos, deben usarse con cuidado. Son más adecuados cuando se tiene la absoluta certeza de que la operación tendrá éxito, o durante el desarrollo y las pruebas.

challenge icon

Desafío

Fácil

Recibirás dos entradas. La primera entrada es un número (como una cadena), y la segunda entrada es un indicador de estado (ok o error). Crea un Result<i32, &'static str> basado en el estado. Si el estado es ok, crea un Ok que contenga el número analizado. Si el estado es error, crea un Err con el mensaje "Invalid operation". Usa .expect() con un mensaje personalizado para extraer el valor del Result e imprimirlo.

Requisitos:

  • Lee la primera entrada (número) y elimina los espacios en blanco
  • Analiza la primera entrada a i32
  • Lee la segunda entrada (estado) y elimina los espacios en blanco
  • Crea una variable Result<i32, &'static str>:
    • Si el estado es ok, asigna Ok(parsed_number)
    • Si el estado es error, asigna Err("Invalid operation")
  • Usa .expect("Failed to get value") para extraer el valor del Result
  • Imprime el valor extraído en el formato: Value: [value]

Entrada:

  • Primera línea: Un número (por ejemplo, 75)
  • Segunda línea: Ya sea ok o error

Salida:

  • Si el estado es ok: Value: [number]
  • Si el estado es error: El programa entrará en pánico con el mensaje personalizado (no se prueba en este desafío)

Nota: Para este desafío, los casos de prueba solo usarán el estado ok para asegurar una ejecución exitosa. El caso error causaría un pánico, que es el comportamiento esperado de .expect() al encontrar un Err.

Hoja de referencia

Los métodos .unwrap() y .expect() funcionan con tipos Result para extraer valores de la variante Ok.

.unwrap() extrae el valor de un Ok, pero entra en pánico (panics) si el Result es un Err:

let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // Imprime: Value: 42

.expect() funciona de la misma manera pero permite proporcionar un mensaje de pánico personalizado para facilitar la depuración:

let success: Result<i32, &str> = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Imprime: Value: 42

// Esto entraría en pánico con el mensaje personalizado:
let failure: Result<i32, &str> = Err("Something went wrong");
let value = failure.expect("This should work!"); // Entra en pánico con el mensaje personalizado

Estos métodos deben usarse con cuidado, ya que cerrarán inesperadamente su programa si el Result es un Err. Son más apropiados cuando se tiene la certeza de que la operación tendrá éxito o durante el desarrollo y las pruebas.

Pruébalo tú mismo

use std::io;

fn main() {
    // Leer la primera entrada (número)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Convertir el número a i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // Leer la segunda entrada (estado)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO: Escribe tu código abajo
    // Crear un Result<i32, &'static str> basado en el estado
    // Usar .expect() para extraer el valor
    // Imprimir el resultado en el formato: Value: [value]
    
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow