Menu
CoddyTech

Atajos: unwrap y expect

Parte de la sección Lógica y Flujo del Journey de Rust de Coddy. Lección 45 de 66.

Ya aprendiste sobre .unwrap() y .expect() con Option, y estos mismos métodos también funcionan con Result. Sin embargo, su comportamiento es ligeramente diferente al manejar los casos de éxito y de 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 se bloqueará. 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 provocaría un pánico con el mensaje personalizado:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // ¡Provoca un pánico!

Si bien estos métodos permiten acceder rápidamente a los valores correctos, deben usarse con cuidado. Son más apropiados cuando tienes la certeza absoluta 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 cadena) y la segunda es un indicador de estado (ok o error). Crea un Result<i32, &'static str> según 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 de Result e imprimirlo.

Requisitos:

  • Lee la primera entrada (número) y elimina los espacios en blanco
  • Analiza la primera entrada como 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 de Result
  • Imprime el valor extraído con el formato: Value: [value]

Entrada:

  • Primera línea: Un número (p. ej., 75)
  • Segunda línea: 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 evalúa en este desafío)

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

Pruébalo tú mismo

use std::io;

fn main() {
    // Lee 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();
    
    // Convierte el número a i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // Lee la segunda entrada (status)
    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 a continuación
    // Crea un Result<i32, &'static str> según status
    // Usa .expect() para extraer el valor
    // Imprime el resultado con 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 Lógica y Flujo

Practica por tu cuenta: Compilador de Rust online