Menu
Coddy logo textTech

Proporcionar un valor por defecto: unwrap_or

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

Mientras que .unwrap() y .expect() pueden extraer valores de un Option, ambos tienen un defecto importante: provocan un pánico al encontrar un None. Para un código más seguro, Rust proporciona .unwrap_or(), un método que nunca entra en pánico.

El método .unwrap_or() toma un valor por defecto como argumento. Si el Option contiene un Some, devuelve el valor interno. Si es un None, devuelve el valor por defecto que proporcionaste:

let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // Imprime: Score: 85

let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // Imprime: Score: 0

Este enfoque es mucho más seguro que .unwrap() porque tu programa nunca fallará: siempre obtendrás un valor utilizable.

challenge icon

Desafío

Fácil

Recibirás dos entradas. La primera entrada es una puntuación (como un número), y la segunda entrada indica si la puntuación está disponible (yes) o falta (no). Crea un Option<i32> basado en el estado de disponibilidad. Usa .unwrap_or() para extraer de forma segura la puntuación con un valor predeterminado de 50, luego imprime la puntuación final.

Requisitos:

  • Lee la primera entrada (puntuación) y elimina los espacios en blanco
  • Convierte la primera entrada a i32
  • Lee la segunda entrada (estado de disponibilidad) y elimina los espacios en blanco
  • Crea una variable Option<i32>:
    • Si el estado de disponibilidad es yes, asigna Some(score)
    • Si el estado de disponibilidad es no, asigna None
  • Usa .unwrap_or(50) para extraer la puntuación con un valor predeterminado de 50
  • Imprime la puntuación final en el formato: Final score: [score]

Entrada:

  • Primera línea: Un número que representa la puntuación (por ejemplo, 85)
  • Segunda línea: Ya sea yes o no

Salida:

  • Si el estado de disponibilidad es yes: Final score: [score] (la puntuación real)
  • Si el estado de disponibilidad es no: Final score: 50 (el valor predeterminado)

Hoja de referencia

El método .unwrap_or() proporciona una forma segura de extraer valores de un Option sin provocar un pánico. Toma un valor por defecto como argumento y devuelve el valor interno si es Some, o el valor por defecto si es None:

let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
// score es 85

let no_score: Option<i32> = None;
let default_score = no_score.unwrap_or(0);
// default_score es 0

Este método es más seguro que .unwrap() o .expect() porque nunca causa un pánico; siempre recibes un valor utilizable.

Pruébalo tú mismo

use std::io;

fn main() {
    // Leer la puntuación
    let mut score_input = String::new();
    io::stdin().read_line(&mut score_input).expect("Failed to read line");
    let score: i32 = score_input.trim().parse().expect("Invalid number");
    
    // Leer el estado de disponibilidad
    let mut availability = String::new();
    io::stdin().read_line(&mut availability).expect("Failed to read line");
    let availability = availability.trim();
    
    // TODO: Escribe tu código a continuación
    // Crear un Option<i32> basado en el estado de disponibilidad
    // Usar .unwrap_or(50) para obtener la puntuación final
    
    
    // Imprimir el resultado
    println!("Final score: {}", final_score);
}
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