스코프, 변수 가리기

변수 바인딩은 스코프(scope, 범위)를 가지며, 블록 내에서만 존재할 수 있습니다. 블록은 {} 로 둘러싸인 구문의 모음을 의미합니다.

fn main() {
    // 메인 함수 내에서 존재하는 바인딩
    let long_lived_binding = 1;

    // 메인 함수보다는 스코프가 작은 블록입니다.
    {
        // 이 블록 내에서만 존재하는 바인딩
        let short_lived_binding = 2;

        println!("내부에서의 수명 짧은 바인딩: {}", short_lived_binding);
    }
    // 블록 끝

    // 에러! `short_lived_binding`는 이 스코프에 존재하지 않습니다.
    println!("외부에서의 수명 짧은 바인딩: {}", short_lived_binding);
    // 고쳐주세요! ^ 이 줄을 주석 처리해주세요.

    println!("외부에서의 수명 긴 바인딩: {}", long_lived_binding);
}

또한, 변수는 가려질 수 있습니다. (variable shadowing)

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