Gestión de lifetimes en structs de Rust

Beginner

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

Introducción

En este laboratorio, tenemos un código Rust que demuestra el uso de los lifetimes en structs. El código incluye un struct llamado Borrowed que contiene una referencia a un i32, y la referencia debe sobrevivir al struct mismo. También hay un struct llamado NamedBorrowed con dos referencias a i32, ambas deben sobrevivir al struct. Además, hay un enum llamado Either que puede ser un i32 o una referencia a uno, y la referencia debe sobrevivir al enum. Finalmente, el código crea instancias de estos structs y enum, e imprime su contenido para mostrar el uso de los lifetimes 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.

Structs

La anotación de lifetimes en estructuras también es similar a las funciones:

// Un tipo `Borrowed` que contiene una referencia a un
// `i32`. La referencia a `i32` debe sobrevivir a `Borrowed`.
#[derive(Debug)]
struct Borrowed<'a>(&'a i32);

// Del mismo modo, ambas referencias aquí deben sobrevivir a esta estructura.
#[derive(Debug)]
struct NamedBorrowed<'a> {
    x: &'a i32,
    y: &'a i32,
}

// Un enum que puede ser un `i32` o una referencia a uno.
#[derive(Debug)]
enum Either<'a> {
    Num(i32),
    Ref(&'a i32),
}

fn main() {
    let x = 18;
    let y = 15;

    let single = Borrowed(&x);
    let double = NamedBorrowed { x: &x, y: &y };
    let reference = Either::Ref(&x);
    let number    = Either::Num(y);

    println!("x is borrowed in {:?}", single);
    println!("x and y are borrowed in {:?}", double);
    println!("x is borrowed in {:?}", reference);
    println!("y is *not* borrowed in {:?}", number);
}

Resumen

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