Escopos e Sobreposição

Você pode sobrepor (shadow) variáveis, tanto aquelas de escopos externos quanto variáveis do mesmo escopo:

fn main() {
    let a = 10;
    println!("antes: {a}");

    {
        let a = "olá";
        println!("escopo interno: {a}");

        let a = true;
        println!("sobreposto no escopo interno: {a}");
    }

    println!("depois: {a}");
}
  • Definição: Shadowing é diferente da mutação, porque após a sobreposição (shadowing), os locais de memória de ambas as variáveis existem ao mesmo tempo. Ambas estão disponíveis com o mesmo nome, dependendo de onde você as usa no código.
  • Uma variável sobreposta pode ter um tipo diferente.
  • A sobreposição parece obscura a princípio, mas é conveniente para manter os valores após .unwrap().
  • O código a seguir demonstra por que o compilador não pode simplesmente reutilizar locais de memória ao sobrepor uma variável imutável em um escopo, mesmo que o tipo não seja alterado.
fn main() {
    let a = 1;
    let b = &a;
    let a = a + 1;
    println!("{a} {b}");
}