Затенение
Повторное связывание переменных
«Затенение» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
What Is Shadowing?
Затенение (shadowing) означает объявление новой переменной с тем же именем, что и у предыдущей. Новая привязка «затеняет» старую.
Это делается путем повторного использования let с тем же именем.
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("x is {}", x);
}Shadowing Is Not Mutation
Затенение (shadowing) создает совершенно новую переменную. Это отличается от mut, который повторно использует ту же самую переменную.
Поскольку каждое let является новой привязкой, значения могут даже иметь разные типы.
fn main() {
let y = 10; // immutable
let y = y + 5; // new binding, also immutable
println!("y is {}", y);
}Changing Types with Shadowing
Эффективный способ использования затенения — повторное использование имени при изменении его типа.
В данном примере строка преобразуется в число под тем же именем.
fn main() {
let spaces = " ";
let spaces = spaces.len();
println!("count is {}", spaces);
}Why mut Cannot Change Type
С помощью mut можно изменить значение, но не тип.
Этот код не скомпилируется:
let mut spaces = " ";spaces = spaces.len();— ошибка несовпадения типов.
Затенение (shadowing) позволяет избежать этого, так как при нём создаётся новая переменная.
fn main() {
let mut count = 3;
count = 4; // ok, same type
println!("{}", count);
}Shadowing in Inner Scopes
Переменная может быть перекрыта внутри внутреннего блока. Когда блок завершается, внешняя привязка снова становится видимой.
fn main() {
let n = 1;
{
let n = n * 10;
println!("inner {}", n);
}
println!("outer {}", n);
}Transforming Step by Step
Затенение (shadowing) позволяет преобразовывать значение через несколько этапов, сохраняя при этом одно понятное имя.
fn main() {
let input = "42";
let input: i32 = input.trim().parse().unwrap();
let input = input * 2;
println!("result {}", input);
}Shadowing Keeps Immutability
Каждая затенённая привязка остаётся неизменяемой. После преобразования вы сохраняете безопасность неизменяемости, не придумывая новые имена, такие как x2 или x_temp.
fn main() {
let price = 100;
let price = price - 20; // discount applied
let price = price + 5; // shipping added
println!("final price {}", price);
}Shadowing with Different Logic
Вы можете вычислять новое значение любым удобным способом, в том числе с помощью вызовов функций или выражений.
fn main() {
let text = "hello";
let text = text.to_uppercase();
println!("{}", text);
}Avoiding Confusion
Затенение (shadowing) — полезная техника, но её чрезмерное использование может запутать читателей. Применяйте её только тогда, когда каждый шаг является четким преобразованием одной и той же концепции, а не просто для произвольного повторного использования имён.
fn main() {
let raw = " Rust ";
let raw = raw.trim(); // clean version
println!("[{}]", raw);
}Shadowing vs Reassignment Summary
Два способа присвоить имени новое значение:
- Затенение (Shadowing): снова
let x = ...;— новая переменная, может изменить тип, остается неизменяемой. - Переприсваивание (Reassignment):
x = ...;с использованиемmut— та же переменная, требуется тот же тип.
fn main() {
let val = "7";
let val: i32 = val.parse().unwrap(); // shadow + type change
let mut val = val;
val += 1; // reassign, same type
println!("{}", val);
}A Practical Example
Чтение и преобразование пользовательских данных — классический пример затенения: сохраняется значимое имя age, в то время как тип меняется с текстового на числовой.
fn main() {
let age = "25";
let age: u32 = age.parse().unwrap();
let age = age + 1; // next birthday
println!("next year you will be {}", age);
}Quick Check
Определите, чем переопределение (shadowing) отличается от использования mut.
Recap
Затенение (shadowing) в Rust:
- Повторное использование
letс тем же именем для создания новой привязки. - Новая привязка может иметь другой тип.
- Каждое затененное значение остается неизменяемым.
- Это отличается от
mut, который изменяет ту же переменную и сохраняет её тип.
fn main() {
let data = "100";
let data: i32 = data.parse().unwrap();
let data = data / 4;
println!("final {}", data);
}Часто задаваемые вопросы
Урок «Затенение» бесплатный?
Да — полный текст урока «Затенение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Затенение»?
Повторное связывание переменных Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Затенение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.