En la programación informática, el sombreado de variables o variable shadowing se produce cuando una variable declarada dentro de un determinado ámbito (bloque de decisión, método o clase interna) tiene el mismo nombre que una variable declarada en un ámbito externo.
fn main() {
let a = 10;
println!("before: {a}");
{
let a = "hello";
println!("inner scope: {a}");
let a = true;
println!("shadowed in inner scope: {a}");
}
println!("after: {a}");
}
$ cargo run
Compiling hello_cargo v0.1.0
Finished dev [unoptimized + debuginfo] target(s) in 1.32s
Running `target/debug/hello_cargo`
before: 10
inner scope: hello
shadowed in inner scope: true
after: 10
Definición: El sombreado es diferente de la mutación, porque después del sombreado, las ubicaciones de memoria de ambas variables existen al mismo tiempo. Ambos están disponibles con el mismo nombre, dependiendo de dónde lo use en el código.
Una variable de sombreado puede tener un tipo diferente.
El sombreado parece oscuro al principio, pero es conveniente para mantener los valores después de .unwrap().
El siguiente código demuestra por qué el compilador no puede simplemente reutilizar ubicaciones de memoria cuando oculta una variable inmutable en un ámbito, incluso si el tipo no cambia.
fn main() {
let a = 1;
let b = &a;
let a = a + 1;
println!("{a} {b}");
}