Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

変数束縛にはスコープがあり、_ブロック_内で生存するよう制約されます。ブロックとは、中括弧 {} で囲まれた文の集まりです。

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