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
.
Some(T)
- Se ha identificado un elemento de tipoT
.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),
}