Ámbitos y Shadowing
Puedes sombrear variables, tanto las de ámbitos externos como las del propio ámbito:
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}"); }
- Definición: Shadowing (sombreado) es distinto de la mutación, ya que, después de sombrear la memoria de las dos variables, las ubicaciones existen al mismo tiempo. Ambas están disponibles bajo el mismo nombre, en función de dónde se utiliza en el código.
- Una variable sombreada puede tener un tipo diferente.
- Al principio, el sombreado no es fácil, pero resulta útil para conservar valores después de
.unwrap()
. - El siguiente fragmento de código demuestra por qué el compilador no puede reutilizar ubicaciones de memoria cuando sombrea 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}"); }