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

Beginner

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

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.

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.