https://doc.rust-lang.org/stable/std/string/struct.String.html#method.from_utf8
たとえばこの String::from_utf8 みたいな感じで
C でもブロックを明示すれば同じことはできるので、よーするに Rust ではブロックを暗黙に作ってくれるというだけのようなもの (あと Rust ではブロックも式であり値に評価されるので、この解釈とは相性が良い)
let foo = 1;
let foo = "foo";
bar(foo);
というのは、実際には
{
let foo = 1;
{
let foo = "foo";
{
bar(foo);
}
}
}
のようなことをやっているわけで、 shadow された変数が消えるわけでもないし破棄されるわけでもないし上書きされるわけでもない、あくまで shadow されて「名前で」参照できなくなるだけ