Rustでは、同じ名前の変数を複数回宣言できます。
fn main() {
    let a = 10;
    println!("{}", a);
    let a = 20;
    println!("{}", a);
}
1 つめの  a  と 2 つめの  a  は、名前は同じですが、別の変数とみなされます。
1 回目の  println!  では、1番目の a の値が出力され、2 回目の  println!  では、2番目の a の値が出力されます。
出力は上から 10  20  となります。
ここで注意しなくてはならないのは、同じ名前の変数を宣言すると、それより前に宣言した変数が使えなくなってしまうという事です。
これを変数のシャドーイングと言います。
fn main() {
    let a = 10;
    {
        println!("{}", a);
        let a = 20;
        println!("{}", a);
    }
    println!("{}", hoge);
}
上記コードのようにシャドーイングをブロックの中で行うと、ブロックを抜けた後は 2 つめの  a  が存在しないので、最後の  println!  では 1 つめの  a  の値が出力されます。
よって、出力は上から 10  20  10  となります。
