シャドーイングは、変数をmutにするのとは違います。なぜなら、letキーワードを使わずに、 誤ってこの変数に再代入を試みようものなら、コンパイルエラーが出るからです。letを使うことで、 値にちょっとした加工は行えますが、その加工が終わったら、変数は不変になるわけです。
let を使用して同名の変数を宣言すると、最初に宣言した変数の上書き(シャドーイング)が可能
mutと上書きのもう一つの違いは、再度letキーワードを使用したら、実効的には新しい変数を生成していることになるので、 値の型を変えつつ、同じ変数名を使いまわせることです。
mut (可変性)との違いは、上記の引用にあるように、型も変えることができること。こちらの機能を利用するうまみは、下記の例が分かりやすい
例えば、 プログラムがユーザに何らかのテキストに対して空白文字を入力することで何個分のスペースを表示したいかを尋ねますが、 ただ、実際にはこの入力を数値として保持したいとしましょう:
let spaces = " ";
let spaces = spaces.len();
この文法要素は、容認されます。というのも、最初のspaces変数は文字列型であり、2番目のspaces変数は、 たまたま最初の変数と同じ名前になったまっさらな変数のわけですが、数値型になるからです。故に、シャドーイングのおかげで、 異なる名前を思いつく必要がなくなるわけです。spaces_strとspaces_numなどですね;
代わりに、 よりシンプルなspacesという名前を再利用できるわけです。
実際に入力 or 表示をしたいスペースと、プログラムとして保持しておきたいスペースの個数。このような変数は同一としつつも、最終的に保持しておきたい数値を加工したい場合に便利。
わざわざ2つの変数を宣言して処理をする必要はなくなる。
競技プログラミングでも、シャドーイングを利用することですっきりコードを記述できそう
mut の宣言を明示的にすることもとても良い。コードを確認した時に、この変数は値が更新される!とプログラマーにはっきり分かるから。