スコープとシャドーイング
変数はスコープを持つため、 ブロック の中に閉じ込められています。ブロックとは{}で囲まれた領域のことです。
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);
}