Область видимости и затенение

Связывание переменных происходит в локальной области видимости — они ограничены существованием внутри блока. Блок — это набор инструкций, заключённый между фигурными скобками {}.

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);
}