# Затенение переменных (Shadowing) в Rust на реальных примерах

> Особенности и преимущества затенения переменных (Shadowing) в языке Rust: переиспользование имен, изменение типов данных и лучшие практики.

- **URL:** https://eagle2000.space/rust/rust-shadowing/
- **Date:** 2025-05-14

- **Tags:** rust, dev

---## Затенение (variable shadowing)
Затенение переменных - это концепция Rust, которая позволяет повторно объявить переменную с тем же именем, используя ключевое слово `let`. При этом оригинальная переменная заменяется (затеняется) новой, что позволяет изменять тип или состояние данных без создания временных переменных (например, `temp_str` или `temp_float`).

## Пример использования затенения

Один из наиболее распространенных примеров, где это может потребоваться - это последовательная трансформация данных и работа с локальными областями видимости (например, обработка данных с температурных датчиков или сенсоров яркости в умном доме).


### 💻 Затенение переменных в Rust


#### Шаг 1

```rust
fn main() {
    let temperature = "25.5";
    let temperature: f64 = temperature.parse().unwrap();
    let mut temperature = temperature * 9.0 / 5.0 + 32.0; // переводим в Фаренгейт

    temperature = temperature + 1.0;
    println!("Температура: {}", temperature);
}
```

**Последовательная трансформация данных**
- Затенение позволяет повторно использовать имя переменной `temperature`.
- Мы изменили тип данных со строки `&str` на число `f64`.
- В конце мы сделали её изменяемой с помощью `let mut`.


#### Шаг 2

```rust
fn main() {
    let brightness = "50";
    {
        let brightness: u8 = brightness.parse().unwrap();
        println!("Внутри блока: {}%", brightness);
        let brightness = brightness + 20;
        println!("Внутри блока (увеличено): {}%", brightness);
    }
    println!("Вне блока (оригинал): {}", brightness);
}
```

**Затенение во вложенной области видимости (Scope)**
- Внутри блока `{}` мы затеняем внешнюю переменную `brightness` новым типом и значением.
- После выхода из блока временные переменные удаляются из стека.
- Внешняя переменная восстанавливает своё оригинальное значение `"50"`.


### Описание работы примера:

1. **Шаг 1. Последовательная трансформация данных**:
   - Сначала мы объявили переменную `temperature` со строковым значением `"25.5"`.
   - Затем с помощью ключевого слова `let` затенили её новой переменной типа `f64`, распарсив строку.
   - Далее мы перевели значение в Фаренгейты, а затем переопределили её как изменяемую (`mut`), прибавив единицу. Это позволяет повторно использовать понятное имя переменной без придумывания временных названий.

2. **Шаг 2. Затенение в рамках области видимости (scope)**:
   - Мы объявили внешнюю переменную `brightness` со строковым значением `"50"`.
   - Внутри блока `{}` мы объявили локальную переменную `brightness` с типом `u8` и числовым значением `50`.
   - Внутри блока мы затенили её ещё раз, увеличив на `20`.
   - После выхода из блока все временные локальные переменные очищаются из стека, и внешняя переменная восстанавливает своё оригинальное значение `"50"`.

Надеюсь, эта статья помогла вам понять концепцию затенения переменных в Rust и избавит вас от придумывания новых имен для переменных наподобие `upd_temperature`.











