C でもブロックを明示すれば同じことはできるので、よーするに Rust ではブロックを暗黙に作ってくれるというだけのようなもの (あと Rust ではブロックも式であり値に評価されるので、この解釈とは相性が良い)
let foo = 1;
let foo = "foo";
bar(foo);
というのは、実際には
{
let foo = 1;
{
let foo = "foo";
{
bar(foo);
}
}
}
のようなことをやっているわけで、 shadow された変数が消えるわけでもないし破棄されるわけでもないし上書きされるわけでもない、あくまで shadow されて「名前で」参照できなくなるだけ
同一スコープ内での同名変数の再宣言とシャドウイング|Rustでは再宣言が可能 https://qiita.com/aimof/items/01911a187d7351c8313c
"別の言語ではどうなるか? その2:再宣言できる言語"
"Haskellでは、再宣言可能です。ちなみにHaskellの変数(と呼ぶのが適切かはわかりませんが)はimmutable(不変)です。"
めっちゃくちゃ変化してるじゃん?><;