Coerción

Una vida útil más larga se puede convertir en una más corta para que funcione dentro de un ámbito en el que normalmente no funcionaría. Esto se presenta en forma de coerción inferida por parte del compilador de Rust, y también en la forma de declarar una diferencia de vida útil:

// Aquí, Rust infiere una vida útilo lo más corta posible.
// Las dos referencias son luego forzadas a esa vida útil.
fn multiplica<'a>(primero: &'a i32, segundo: &'a i32) -> i32 {
    primero * segundo
}

// `<'a:' b, 'b>` se lee como vida útil `'a` es al menos tan larga como `'b`.
// Aquí, tomamos un `&'a i32` y devolvemos un `&' b i32` como resultado de la coerción.
fn escoge_primero<'a: 'b, 'b>(primero: &'a i32, _: &'b i32) -> &'b i32 {
    primero
}

fn main() {
    let primero = 2; // Vida útil más larga
    
    {
        let segundo = 3; // Vida útil más corta
        
        println!("El producto es {}", multiplica(&primero, &segundo));
        println!("{} es el primero", escoge_primero(&primero, &segundo));
    };
}