Anotación explícita

El verificador de préstamos usa anotaciones explícitas de por vida para determinar cuánto tiempo deben ser válidas las referencias. En los casos en los que no se eliminan las duraciones 1, Rust requiere anotaciones explícitas para determinar cuál debería ser la vida útil de una referencia. La sintaxis para anotar explícitamente una vida usa un carácter de apóstrofo de la siguiente manera:

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

Al igual que clausuras, el uso de vidas útiles requiere genéricos. Además, esta sintaxis de duración indica que la duración de foo no puede exceder la de 'a. La anotación explícita de un tipo tiene la forma &'a T donde ya se ha introducido 'a.

En casos con múltiples vidas útiles, la sintaxis es similar:

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

En este caso, la vida útil de foo no puede exceder la de 'a o 'b.

Consulta el siguiente ejemplo para ver la anotación de duración explícita en uso:

// `imprime_refs` toma dos referencias a `i32` que tienen diferentes vidas
// útiles `'a` y`' b`.
// Estas dos vidas útiles deben ambas ser al menos tan largas como la función
// `imprime_refs`.
fn imprime_refs<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("x es {} y y es {}", x, y);
}

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

    // ERROR: `_x` no vive lo suficiente
    let y: &'a i32 = &_x;
    // Intentando usar el tiempo de vida útil `'a` como una anotación de tipo explícita
    // dentro de la función fallará porque la vida útil de `&_x` es más corta que la de
    // `y`. Una vida útil corta no se puede convertir en una más larga.
}

fn main() {
    // Crea variables para tomar prestadas a continuación.
    let (cuatro, nueve) = (4, 9);
    
    // Los préstamos (`&`) de ambas variables se pasan a la función.
    imprime_refs(&cuatro, &nueve);
    // Cualquier insumo que se tome prestado debe sobrevivir al prestatario.
    // En otras palabras, la vida útil de `cuatro` y `nueve` debe ser más larga que la
    // de `imprime_refs`.

    prestamo_fallido();
    // `prestamo_fallido` no contiene referencias para forzar a `'a` a ser más larga
    // que la vida útil de la función, pero `'a` es más larga.
    // Debido a que la vida útil nunca está limitada, el valor predeterminado es
    // `'estático`.
}
1

la elisión anota implícitamente las vidas y, por lo tanto, es diferente.

Ve también

tipos genéricos y clausuras