Límites de período de vida y rasgos en Rust

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 los límites en Rust, que se utilizan para restringir los períodos de vida o los rasgos de los tipos genéricos. El carácter : se utiliza para indicar que todas las referencias en un tipo deben tener un período de vida mayor que un cierto período de vida, mientras que + se utiliza para indicar que un tipo debe implementar un rasgo y todas las referencias en él deben tener un período de vida mayor que un cierto período de vida. Un fragmento de código de ejemplo demuestra la sintaxis y el uso de los límites en Rust.

Nota: Si el laboratorio no especifica un nombre de archivo, puede usar cualquier nombre de archivo que desee. Por ejemplo, puede usar 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/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99209{{"Límites de período de vida y rasgos en Rust"}} rust/function_syntax -.-> lab-99209{{"Límites de período de vida y rasgos en Rust"}} rust/expressions_statements -.-> lab-99209{{"Límites de período de vida y rasgos en Rust"}} rust/operator_overloading -.-> lab-99209{{"Límites de período de vida y rasgos en Rust"}} end

Límites

Al igual que los tipos genéricos pueden estar limitados, los períodos de vida (que son genéricos por sí mismos) también utilizan límites. El carácter : tiene un significado ligeramente diferente aquí, pero + es el mismo. Observe cómo se lee lo siguiente:

  1. T: 'a: Todas las referencias en T deben tener un período de vida mayor que el período de vida 'a.
  2. T: Trait + 'a: El tipo T debe implementar el rasgo Trait y todas las referencias en T deben tener un período de vida mayor que 'a.

El ejemplo siguiente muestra la sintaxis anterior en acción utilizada después de la palabra clave where:

use std::fmt::Debug; // Trait con el que se limita.

#[derive(Debug)]
struct Ref<'a, T: 'a>(&'a T);
// `Ref` contiene una referencia a un tipo genérico `T` que tiene
// un período de vida desconocido `'a`. `T` está limitado de modo que cualquier
// *referencia* en `T` debe tener un período de vida mayor que `'a`. Además, el período de vida
// de `Ref` no puede exceder `'a`.

// Una función genérica que imprime utilizando el rasgo `Debug`.
fn print<T>(t: T) where
    T: Debug {
    println!("`print`: t es {:?}", t);
}

// Aquí se toma una referencia a `T` donde `T` implementa
// `Debug` y todas las *referencias* en `T` tienen un período de vida mayor que `'a`. Además,
// `'a` debe tener un período de vida mayor que la función.
fn print_ref<'a, T>(t: &'a T) where
    T: Debug + 'a {
    println!("`print_ref`: t es {:?}", t);
}

fn main() {
    let x = 7;
    let ref_x = Ref(&x);

    print_ref(&ref_x);
    print(ref_x);
}

Resumen

¡Felicitaciones! Has completado el laboratorio de Límites. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.