2026-09-20
shadow_scope.rs
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
{
let x = x * 10;
println!("inner: {x}");
}
println!("outer: {x}");
}
let x = ...が4回出てきます。mutは一度も使っていません。これは何を出力するでしょうか?
Answer
inner: 120、outer: 12 — 1行ずつ。let x = x + 1;のような書き方は再代入ではなく、同じ名前xで新しい変数を作るシャドーイングです。再代入(x = ...)にはmutが要りますが、シャドーイングはletで新しい束縛を作っているだけなのでmutは不要です。最初の3つのletは同じブロック内で順にxを上書きしていくように見えるので、5 → 6 → 12と進みます。内側の{ }ブロックの中のlet x = x * 10;もシャドーイングで、そのブロックの中だけで通用する新しいx(値は120)を作ります。この新しいxはブロックを抜けると同時にスコープごと消えるので、外側のx(値12)には一切影響しません。もしこれが本物の再代入(x *= 10のような)だったなら外側の値も120に変わってしまいますが、シャドーイングはあくまで「そのスコープで通用する新しい変数」を作るだけなので、ブロックを抜けたprintln!には元の12が見えます。