Rust Lifetime Annotations Borrow Checker

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, se introduce el concepto de anotaciones de tiempo de vida explícitas en Rust, que son utilizadas por el verificador de préstamos para determinar la validez de las referencias.

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/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") subgraph Lab Skills rust/variable_declarations -.-> lab-99203{{"Rust Lifetime Annotations Borrow Checker"}} rust/integer_types -.-> lab-99203{{"Rust Lifetime Annotations Borrow Checker"}} rust/type_casting -.-> lab-99203{{"Rust Lifetime Annotations Borrow Checker"}} rust/function_syntax -.-> lab-99203{{"Rust Lifetime Annotations Borrow Checker"}} rust/expressions_statements -.-> lab-99203{{"Rust Lifetime Annotations Borrow Checker"}} end

Anotación explícita

El verificador de préstamos utiliza anotaciones de tiempo de vida explícitas para determinar durante cuánto tiempo las referencias deben ser válidas. En casos en los que los tiempos de vida no se omiten, Rust requiere anotaciones explícitas para determinar cuál debe ser el tiempo de vida de una referencia. La sintaxis para anotar explícitamente un tiempo de vida utiliza el carácter apóstrofe de la siguiente manera:

foo<'a>
// `foo` tiene un parámetro de tiempo de vida `'a`

Similar a las clausuras, utilizar tiempos de vida requiere genéricos. Además, esta sintaxis de tiempo de vida indica que el tiempo de vida de foo no puede exceder el de 'a. La anotación explícita de un tipo tiene la forma &'a T donde 'a ya ha sido introducido.

En casos con múltiples tiempos de vida, la sintaxis es similar:

foo<'a, 'b>
// `foo` tiene parámetros de tiempo de vida `'a` y `'b`

En este caso, el tiempo de vida de foo no puede exceder el de 'a o 'b.

Vea el siguiente ejemplo para ver la anotación de tiempo de vida explícita en uso:

// `print_refs` toma dos referencias a `i32` que tienen diferentes
// tiempos de vida `'a` y `'b`. Ambos tiempos de vida deben ser al
// menos tan largos como la función `print_refs`.
fn print_refs<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("x is {} and y is {}", x, y);
}

// Una función que no toma argumentos, pero tiene un parámetro de tiempo de vida `'a`.
fn failed_borrow<'a>() {
    let _x = 12;

    // ERROR: `_x` no tiene un tiempo de vida lo suficientemente largo
    let y: &'a i32 = &_x;
    // Intentar utilizar el tiempo de vida `'a` como una anotación de tipo explícita
    // dentro de la función fallará porque el tiempo de vida de `&_x` es más corto
    // que el de `y`. Un tiempo de vida corto no se puede forzar a ser más largo.
}

fn main() {
    // Crea variables para prestar más adelante.
    let (four, nine) = (4, 9);

    // Las prestas (`&`) de ambas variables se pasan a la función.
    print_refs(&four, &nine);
    // Cualquier entrada que sea prestada debe tener un tiempo de vida mayor que el del prestamista.
    // En otras palabras, el tiempo de vida de `four` y `nine` debe
    // ser más largo que el de `print_refs`.

    failed_borrow();
    // `failed_borrow` no contiene referencias para forzar `'a` a ser
    // más largo que el tiempo de vida de la función, pero `'a` es más largo.
    // Debido a que el tiempo de vida nunca está restringido, por defecto es `'static`.
}

Resumen

¡Felicitaciones! Has completado el laboratorio de Anotación Explícita. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.