Genéricos expresivos de Rust con cláusula where

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 que una cláusula where en Rust se puede utilizar para expresar límites para tipos genéricos por separado de su declaración, lo que permite una sintaxis más clara, y también se puede aplicar a tipos arbitrarios en lugar de solo a parámetros de tipo. La cláusula where es especialmente útil cuando los límites son más expresivos que la sintaxis normal, como se muestra en el ejemplo que involucra el trato PrintInOption.

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/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/traits("Traits") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} rust/type_casting -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} rust/function_syntax -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} rust/expressions_statements -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} rust/lifetime_specifiers -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} rust/method_syntax -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} rust/traits -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} rust/operator_overloading -.-> lab-99351{{"Genéricos expresivos de Rust con cláusula where"}} end

Cláusulas where

Un límite también se puede expresar utilizando una cláusula where inmediatamente antes de la llave de apertura {, en lugar de en la primera mención del tipo. Además, las cláusulas where pueden aplicar límites a tipos arbitrarios, en lugar de solo a parámetros de tipo.

Algunos casos en los que una cláusula where es útil:

  • Cuando especificar tipos genéricos y límites por separado es más claro:
impl <A: TraitB + TraitC, D: TraitE + TraitF> MyTrait<A, D> for YourType {}

// Expresando límites con una cláusula `where`
impl <A, D> MyTrait<A, D> for YourType where
    A: TraitB + TraitC,
    D: TraitE + TraitF {}
  • Cuando utilizar una cláusula where es más expresiva que utilizar la sintaxis normal. El impl en este ejemplo no se puede expresar directamente sin una cláusula where:
use std::fmt::Debug;

trait PrintInOption {
    fn print_in_option(self);
}

// Debido a que de lo contrario tendríamos que expresarlo como `T: Debug` o
// utilizar otro método de enfoque indirecto, esto requiere una cláusula `where`:
impl<T> PrintInOption for T where
    Option<T>: Debug {
    // Queremos `Option<T>: Debug` como nuestro límite porque eso es lo que
    // se está imprimiendo. Hacer lo contrario sería utilizar el límite incorrecto.
    fn print_in_option(self) {
        println!("{:?}", Some(self));
    }
}

fn main() {
    let vec = vec![1, 2, 3];

    vec.print_in_option();
}

Resumen

¡Felicitaciones! Has completado el laboratorio de Cláusulas where. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.