Затенение (variable shadowing)#
Затенение переменных - это концепция Rust, которая позволяет повторно объявить переменную. Оригинальная переменная заменяется новой, что позволяет создавать новую переменную с тем же именем, прописывая ее название после ключевого слова let
. При этом старая переменная перестает существовать и будет затенена новой переменной.
Давайте рассмотрим на примере, как это работает.
Пример использования затенения#
Один из наиболее распространенных примеров, где это может потребоваться - это последовательная трансформация данных. В нашем примере: с температурных датчиков в системе умного дома.
let temperature = "25.5"; // данные с датчика температуры строкового типа
Мы хотим преобразовать строковое значение температуры в число с плавающей точкой, чтобы выполнить некоторые вычисления.
let temperature = "25.5";
let temperature: f64 = temperature.parse().unwrap(); // преобразуем строку в f64
Теперь мы можем использовать переменную temperature для вычислений.
Если мы захотим изменить единицу измерения температуры с градусов Цельсия на градусы Фаренгейта, мы можем сделать это следующим образом:
let temperature = "25.5";
let temperature: f64 = temperature.parse().unwrap();
let temperature = temperature * 9.0 / 5.0 + 32.0; // преобразуем градусы Цельсия в градусы Фаренгейта
Таким образом, мы можем повторно использовать имя переменной temperature для хранения разных значений и типов данных.
Изменяемость переменных#
Если мы захотим сделать нашу переменную изменяемой, то просто добавляем ключевое слово mut. Про изменяемость переменных вы можете прочитать в прошлой главе.
let temperature = "25.5";
let temperature: f64 = temperature.parse().unwrap();
let mut temperature = temperature * 9.0 / 5.0 + 32.0;
temperature = temperature + 1.0; //теперь можем изменить значение переменной
E0308
- mismatched types.Затенение в рамках области видимости (scope)#
Язык Rust позволяет создавать области видимости, которые могут захватывать значения переменных, объявленных до самой области видимости и очищать их из стека, когда покидается область видимости.
Рассмотрим пример:
let brightness = "50";
1
{
2
let brightness: u8 = brightness.parse().unwrap();
println!("Brightness level is {brightness}%");
let brightness = brightness + 20;
3
println!("New brightness level is {brightness}%");
4
}
println!("Original brightness value is {brightness}");
5
Вывод компилятора будет следующим:
Brightness level is 50%
New brightness level is 70%
Original brightness value is 50
Давайте разберём все подробно 🔎
- На строке 1 мы объявили переменную brightness со строковым значением “50”.
- Внутри блока 2
мы объявили новую переменную brightness с типом u8 и числовым значением 50 после преобразования
parse
. - Затем мы увеличили уровень яркости 3 на 20 и вывели новое значение 4 .
- После выхода из блока значение переменной brightness снова стало “50”, как и было ранее. 5
Вот так элегантно и эффективно мы преобразовывали и выводили значение температуры, не используя никакие костыли в виде новых переменных.
Надеюсь, эта статья помогла вам понять концепцию затенения переменных в Rust и избавит вас от придумывания новых имен для переменных наподобии upd_temperature.
Я в своей практике напридумывал таких приличное количество.