# 🎯 Definição
> [!Abstract] Definição
> O **Sombreamento (Shadowing)** é um recurso do Rust que permite declarar uma nova variável com o mesmo nome de uma variável anterior. A segunda variável "sombreia" a primeira, o que significa que o compilador passará a usar o segundo nome até que ele próprio seja sombreado ou o escopo termine.
# 📝 Notas
## 1. Como funciona
Diferente de apenas alterar o valor de uma variável mutável, o sombreamento cria uma **nova variável** usando a palavra-chave `let`.
```rust
fn main() {
let x = 5;
let x = x + 1; // A primeira variável x é sombreada pela nova declaração
println!("O valor de x é: {x}"); // Resultado: 6
}
```
## 2. Shadowing vs Mutabilidade (`mut`)
Existe uma diferença fundamental entre sombrear uma variável e marcá-la como mutável:
| Característica | Shadowing (`let`) | Mutabilidade (`mut`) |
| :--- | :--- | :--- |
| **Tipo de Dado** | Pode ser alterado | Deve permanecer o mesmo |
| **Re-declaração** | Exige o uso de `let` | Apenas atribuição (`=`) |
| **Estado Final** | A variável pode voltar a ser imutável | A variável permanece mutável |
> [!Tip] Vantagem do Shadowing
> É ideal para transformações de dados onde você não quer criar nomes complexos como `espacos_str` e `espacos_int`.
```rust
// Exemplo de mudança de tipo com Shadowing
let espacos = " "; // Tipo: &str
let espacos = espacos.len(); // Tipo: usize (Válido!)
// Com mut, isso causaria erro:
// let mut espacos = " ";
// espacos = espacos.len(); // ERRO: tipos incompatíveis
```
## 3. Comportamento de Escopo
O sombreamento respeita os blocos de código `{ }`. Uma variável sombreada dentro de um escopo interno deixa de existir quando esse escopo termina.
```rust
fn main() {
let x = 5;
{
let x = x * 2; // Sombreia o x externo apenas neste bloco
println!("Valor no escopo interno: {x}"); // 10
}
println!("Valor no escopo externo: {x}"); // 5
}
```
# 🔗 Conceitos relacionados
- [[Variáveis em Rust]]
- [[Tipos de dados em Rust]]
- [[Escopo de variáveis no Rust]]
# 📚 Referências
- [Variables and Mutability - The Rust Programming Language](https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html)
- [4: Variable Shadowing in Rust - YouTube](https://www.youtube.com/watch?v=JpbI7ULFwiw&t=3s)