Vidas útiles

Una vida útil es una construcción que el compilador (o más específicamente, su verificador de préstamos) utiliza para garantizar que todos los préstamos sean válidos. Específicamente, la vida útil de una variable comienza cuando se crea y finaliza cuando se destruye. Si bien las vidas útiles y los ámbitos a menudo se mencionan juntos, no son lo mismo.

Tomemos, por ejemplo, el caso en el que tomamos prestada una variable a través de &. El préstamo tiene una vida útil determinada por el lugar donde se declara. Como resultado, el préstamo es válido siempre que finalice antes de que se destruya al prestamista. Sin embargo, el alcance del préstamo está determinado por el lugar donde se utiliza la referencia.

En el siguiente ejemplo y en el resto de esta sección, veremos cómo se relacionan las vidas útiles con los ámbitos, así como también las diferencias entre los dos.

// Las vide útiles se anotan a continuación con líneas que denotan la creación
// y destrucción de cada variable.
// `i` tiene la vida útil más larga porque su alcance incluye por completo tanto
// `prestamo1` como `prestamo2`. La duración de `prestamo1` en comparación con
// `prestamo2` es irrelevante ya que son inconexos.
fn main() {
    let i = 3; // Vida útil para `i` comienza. ──────────────────────┐
    //                                                               │
    { //                                                             │
        let prestamo1 = &i; // vida útil de `prestamo1` comienza. ──┐│
        //                                                          ││
        println!("prestamo1: {}", prestamo1); //                    ││
    } // `prestamo1 termina. ───────────────────────────────────────┘│
    //                                                               │
    //                                                               │
    { //                                                             │
        let prestamo2 = &i; // vida útil de `prestamo2` comienza. ──┐│
        //                                                          ││
        println!("prestamo2: {}", prestamo2); //                    ││
    } // `prestamo2` termina. ──────────────────────────────────────┘│
    //                                                               │
}   // Vida útil termina. ───────────────────────────────────────────┘

Ten en cuenta que no se asignan nombres ni tipos a la vida útil de las etiquetas. Esto restringe cómo se podrán utilizar las vidas, como veremos.