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: 0Este enfoque es mucho más seguro que .unwrap() porque tu programa nunca fallará: siempre obtendrás un valor utilizable.
Desafío
FácilRecibirá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, asignaSome(score) - Si el estado de disponibilidad es
no, asignaNone
- Si el estado de disponibilidad es
- Usa
.unwrap_or(50)para extraer la puntuación con un valor predeterminado de50 - 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
yesono
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 0Este 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);
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Flujo de control avanzado
La expresión 'match'Coincidencia de múltiples valoresCoincidencia de rangosLa expresión 'if let'Bucles como expresionesResumen - Analizador de comandos simple4Agrupando datos con Structs
¿Qué es un Struct?Visión general de los StructsAcceso a los campos de un StructStructs mutablesStructs como parámetros de funcionesStructs de tuplaResumen - Crear un Struct de Libro7Manejo de errores con 'Result'
¿Qué es un 'Result'?Uso de 'match' con 'Result'is_ok() e is_err()Atajos: unwrap y expectEl operador de signo de interrogación '?'Parsing de Strings a númerosResumen - Función de división segura10Closures y funciones anónimas
¿Qué es un Closure?Definir un Closure simpleClosures con parámetrosCapturar el entornoResumen - Closure sumador simple2Introducción a los vectores
¿Qué es un vector?Crear un vectorAñadir elementos con pushAcceder a los elementos de un vectorIterar sobre un vectorIteración mutableEliminar elementosResumen: Rastreador de puntuación básico5Pares clave-valor con Hash Maps
¿Qué es un Hash Map?Crear un Hash MapInsertar pares clave-valorAcceder a los valoresIterar sobre un Hash MapActualizar un valorEliminar un parRepaso: Contador de palabras8Proyecto: Inventario simple de artículos
Configuración del proyectoAgregar un artículoVerificar el stockVender un artículoUniendo todo3Lista de tareas en la línea de comandos
Configuración del proyectoAñadir una tareaVer todas las tareasEliminar una tareaCódigo final6Manejo de ausencia con 'Option'
¿Qué es un 'Option'?Uso de 'match' con 'Option'is_some() e is_none()Desempaquetar un 'Option'El método expectProporcionar un valor por defecto: unwrap_orResumen - Encontrar un elemento