スコープとシャドーイング

変数はスコープを持つため、 ブロック の中に閉じ込められています。ブロックとは{}で囲まれた領域のことです。

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 ^ この行をコメントアウトしましょう

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

変数のシャドーイングも可能です。

fn main() {
    let shadowed_binding = 1;

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

        // この変数はスコープ外の同名の変数を *シャドーイング* します。
        let shadowed_binding = "abc";

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

    // この変数束縛は以前に定義した変数を *シャドーイング* します。
    let shadowed_binding = 2;
    println!("shadowed in outer block: {}", shadowed_binding);
}