Iniciante Fundamentos

Shadowing

Shadowing é quando você declara uma nova variável com o mesmo nome de outra usando let. A nova “sombreia” a anterior. É diferente de mutabilidade.

Exemplo básico

fn main() {
    let x = 5;
    let x = x + 1; // novo x = 6
    let x = x * 2; // novo x = 12
    println!("{}", x); // 12
}

Mudar o tipo

Como cada let cria uma variável nova, você pode mudar o tipo, algo que mut não permite:

fn main() {
    let espacos = "   ";          // &str
    let espacos = espacos.len();  // usize
    println!("{}", espacos);      // 3
}

Shadowing vs mut

  • Com mut, o tipo continua o mesmo e o valor muda.
  • Com shadowing, você cria uma variável nova e pode mudar o tipo.
fn main() {
    let mut contador = 0;
    contador = 10; // mesmo tipo, ok

    let valor = "10";
    let valor: i32 = valor.parse().unwrap(); // shadowing muda o tipo
    println!("{} {}", contador, valor);
}

Escopo

A sombra vale só dentro do bloco onde foi criada.

fn main() {
    let n = 1;
    {
        let n = n + 10;
        println!("Interno: {}", n); // 11
    }
    println!("Externo: {}", n); // 1
}