Option & Unwrap

RustRustBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprendemos sobre el enum Option de la librería std de Rust, que se utiliza para manejar casos en los que la ausencia es una posibilidad. Proporciona dos opciones: Some(T) cuando se encuentra un elemento de tipo T, y None cuando no se encuentra ningún elemento. Estos casos se pueden manejar explícitamente utilizando match o implícitamente utilizando unwrap. El manejo explícito permite un mayor control y una salida significativa, mientras que unwrap puede devolver el elemento interno o causar un panic.

Nota: Si el laboratorio no especifica un nombre de archivo, puede utilizar cualquier nombre de archivo que desee. Por ejemplo, puede utilizar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/ErrorHandlingandDebuggingGroup(["Error Handling and Debugging"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/ErrorHandlingandDebuggingGroup -.-> rust/panic_usage("panic! Usage") subgraph Lab Skills rust/variable_declarations -.-> lab-99233{{"Option & Unwrap"}} rust/string_type -.-> lab-99233{{"Option & Unwrap"}} rust/function_syntax -.-> lab-99233{{"Option & Unwrap"}} rust/expressions_statements -.-> lab-99233{{"Option & Unwrap"}} rust/method_syntax -.-> lab-99233{{"Option & Unwrap"}} rust/panic_usage -.-> lab-99233{{"Option & Unwrap"}} end

Option & unwrap

En el último ejemplo, mostramos que podemos causar el fallo del programa a voluntad. Le dijimos a nuestro programa que panicara si bebíamos un limonada azucarada. Pero ¿y si esperamos alguna bebida pero no recibimos ninguna? Ese caso sería igual de malo, por lo que debe ser manejado.

Podríamos probar esto contra la cadena nula (""), como lo hacemos con una limonada. Dado que estamos usando Rust, en lugar de eso, hagamos que el compilador señale los casos en los que no hay bebida.

Un enum llamado Option<T> en la librería std se utiliza cuando la ausencia es una posibilidad. Se manifiesta como una de dos "opciones":

  • Some(T): Se encontró un elemento de tipo T
  • None: No se encontró ningún elemento

Estos casos pueden ser manejados explícitamente a través de match o implícitamente con unwrap. El manejo implícito devolverá el elemento interno o causará un panic.

Tenga en cuenta que es posible personalizar manualmente el panic con expect, pero unwrap de lo contrario nos deja con una salida menos significativa que el manejo explícito. En el siguiente ejemplo, el manejo explícito produce un resultado más controlado mientras que mantiene la opción de panic si se desea.

// El adulto ha visto todo, y puede manejar cualquier bebida bien.
// Todas las bebidas se manejan explícitamente usando `match`.
fn give_adult(drink: Option<&str>) {
    // Especifique un curso de acción para cada caso.
    match drink {
        Some("lemonade") => println!("Yuck! Too sugary."),
        Some(inner)   => println!("{}? How nice.", inner),
        None          => println!("No drink? Oh well."),
    }
}

// Otros `panic`arán antes de beber bebidas azucaradas.
// Todas las bebidas se manejan implícitamente usando `unwrap`.
fn drink(drink: Option<&str>) {
    // `unwrap` devuelve un `panic` cuando recibe un `None`.
    let inside = drink.unwrap();
    if inside == "lemonade" { panic!("AAAaaaaa!!!!"); }

    println!("I love {}s!!!!!", inside);
}

fn main() {
    let water  = Some("water");
    let lemonade = Some("lemonade");
    let void  = None;

    give_adult(water);
    give_adult(lemonade);
    give_adult(void);

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

    drink(coffee);
    drink(nothing);
}

Resumen

¡Felicidades! Has completado el laboratorio de Option & Unwrap. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.