Область видимости и затенение
Связывание переменных происходит в локальной области видимости — они ограничены существованием внутри блока. Блок — это набор инструкций, заключённый между фигурными скобками {}.
fn main() {
// Эта переменная живёт в функции main
let long_lived_binding = 1;
// Это блок, он имеет меньшую область видимости, чем функция main
{
// Эта переменная существует только в этом блоке
let short_lived_binding = 2;
println!("inner short: {}", short_lived_binding);
}
// Конец блока
// Ошибка! `short_lived_binding` нет в этой области видимости
println!("outer short: {}", short_lived_binding);
// ИСПРАВЬТЕ ^ Закомментируйте строку
println!("outer long: {}", long_lived_binding);
}
Кроме того, допускается затенение переменных.
fn main() {
let shadowed_binding = 1;
{
println!("До затенения: {}", shadowed_binding);
// Эта переменная *затеняет* внешнюю
let shadowed_binding = "abc";
println!("затенённая во внутреннем блоке: {}", shadowed_binding);
}
println!("во внешнем блоке: {}", shadowed_binding);
// Эта привязка *затеняет* предыдущую
let shadowed_binding = 2;
println!("затенённая во внешнем блоке: {}", shadowed_binding);
}