스코프와 섀도잉

변수 할당은 스코프를 가지며, 블록 안에서 존재하는 것으로 간주됩니다. 블록은 중괄호 {}로 묶인 선언문 덩어리입니다.

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);
    // FIXME ^ Comment out this line

    println!("outer long: {}", long_lived_binding);
}

또, 변수 섀도잉도 가능합니다.

fn main() {
    let shadowed_binding = 1;

    {
        println!("before being shadowed: {}", shadowed_binding);

        // This binding *shadows* the outer one
        let shadowed_binding = "abc";

        println!("shadowed in inner block: {}", shadowed_binding);
    }
    println!("outside inner block: {}", shadowed_binding);

    // This binding *shadows* the previous binding
    let shadowed_binding = 2;
    println!("shadowed in outer block: {}", shadowed_binding);
}