Ámbito y sombreado

Los enlaces de variables tienen un ámbito y están limitados a vivir en un bloque. Un bloque es una colección de declaraciones encerradas entre corchetes {}.

fn main() {
    // Este enlace vive en la función principal
    let enlace_de_vida_larga = 1;

    // Este es un bloque y tiene un ámbito más pequeño que la función principal
    {
        // Este enlace solo existe en este bloque
        let enlace_de_vida_corta = 2;

        println!("Bloque interior, vida corta: {}", enlace_de_vida_corta);
    }
    // Fin del bloque

    // ¡Error! `enlace_de_vida_corta` no existe en este ámbito
    println!("Exterior del bloque, vida corta: {}", enlace_de_vida_corta);
    // FIXME ^ Comenta esta línea

    println!("Exterior del bloque, vida larga: {}", enlace_de_vida_larga);
}

Además, se permite sombreado de variables.

fn main() {
    let enlace_sombreado = 1;

    {
        println!("antes de ser sombreado: {}", enlace_sombreado);

        // Este enlace *sombrea* al exterior
        let enlace_sombreado = "abc";

        println!("sombreado en bloque interior: {}", enlace_sombreado);
    }
    println!("fuera del bloque interior: {}", enlace_sombreado);

    // Este enlace *sombrea* al anterior
    let enlace_sombreado = 2;
    println!("sombreado en el bloque exterior: {}", enlace_sombreado);
}