Namaran

Code daily. Without assist.

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: 120outer: 12 — 1行ずつ。let x = x + 1;のような書き方は再代入ではなく、同じ名前xで新しい変数を作るシャドーイングです。再代入(x = ...)にはmutが要りますが、シャドーイングはletで新しい束縛を作っているだけなのでmutは不要です。最初の3つのletは同じブロック内で順にxを上書きしていくように見えるので、5612と進みます。内側の{ }ブロックの中のlet x = x * 10;もシャドーイングで、そのブロックの中だけで通用する新しいx(値は120)を作ります。この新しいxはブロックを抜けると同時にスコープごと消えるので、外側のx(値12)には一切影響しません。もしこれが本物の再代入(x *= 10のような)だったなら外側の値も120に変わってしまいますが、シャドーイングはあくまで「そのスコープで通用する新しい変数」を作るだけなので、ブロックを抜けたprintln!には元の12が見えます。