Unwrap y sus usos en Rust

Nilesh Katuwal 7 junio 2022
Unwrap y sus usos en Rust

Este artículo enseñará sobre unwrap y sus usos en Rust.

desenvolver en Rust

En Rust, desenvolver algo significa emitir el siguiente comando: “Dame el resultado del cálculo, y si hubo un error, entra en pánico y detén el programa”. Debido a que desenvolver es un proceso tan sencillo, sería beneficioso para nosotros demostrar el código para ello.

Sin embargo, necesitamos investigar los tipos Option y Result antes de que podamos hacer eso.

Tipo Option

El tipo Option es una forma de expresar la posibilidad de ausencia utilizando el sistema de tipos de Rust. Codificar la posibilidad de ausencia en el sistema de tipos es crucial porque obliga al compilador a obligar al programador a lidiar con la ausencia.

Cuando la ausencia es posible, se utiliza el enum denominado Option<T> de la biblioteca std. Toma la forma de una de dos opciones.

  1. Some(T) - Se ha identificado un elemento de tipo T.
  2. None - No se detectó ningún elemento.

Estas situaciones pueden manejarse usando match explícitamente o implícitamente con unwrap. El manejo implícito devuelve el elemento interno o panics.

Sintaxis:

enum Option<T> {
    None,
    Some(T),
}

Ejemplo para encontrar la extensión del nombre del archivo:

fn find(haystack: &str, words: char) -> Option<usize> { haystack.find(words) }
fn main() {
    let name_of_file = "file.doc";
    match find(name_of_file, '.') {
        None => println!("Extension could not be found."),
        Some(i) => println!("The extension of file is: {}", &name_of_file[i+1..]),
    }
}

Producción :

The extension of file is: doc

Tenga en cuenta que panic se puede personalizar manualmente con expect, pero unwrap produce una salida menos relevante que el manejo explícito. En el ejemplo a continuación, el manejo explícito produce un resultado más controlado mientras mantiene la opción de panic si es necesario.

fn adult_man(food: Option<&str>) {
    match food {
        Some("pasta") => println!("The food does not taste right."),
        Some(inner)   => println!("{}? It could be nice.", inner),
        None          => println!("No good food? Nevertheless."),
    }
}

fn food(food: Option<&str>) {
    let interior = food.unwrap();
    if interior == "pasta" { panic!("Ummmmmm!!!!"); }

    println!("I am glad to have {}s!!!!!", interior);
}

fn main() {
    let bruschetta  = Some("Bruschetta");
    let pasta = Some("pasta");
    let void  = None;

    adult_man(bruschetta);
    adult_man(pasta);
    adult_man(void);

    let spaghetti = Some("spaghetti");
    let nothing = None;

    food(spaghetti);
    food(nothing);
}

Todos los alimentos se manejan explícitamente usando match en el código anterior para el primero.

Toda la comida se manipula implícitamente usando unwrap para la función de sección. Unwrap devuelve panic cuando recibe none.

Producción :

Bruschetta? It could be nice.
The food does not taste right.
No good food? Nevertheless.
I am glad to have spaghettis!!!!!

Tipo Result

Result es una versión más robusta de Option. A diferencia de Option, que expresa la posibilidad de ausencia, Result expresa el potencial de error.

El error generalmente se usa para indicar por qué falló la ejecución de un cálculo. Esta es una forma generalizada de la palabra Option.

Sintaxis:

enum Result<T, E> {
    Ok(T),
    Err(E),
}