// dictionary
シャドーイング.
シャドーイングは、宣言済みの変数と同じ名前で新しい変数をlet宣言する仕組みです。
シャドーイングは実質的に2番目の変数が1番目を覆い隠し、新しい変数を作成することになります。
そのため、「値の型」を変えつつ同じ名前を使い回すことも可能となります。
fn main() {
let spaces = " "; // 入力は文字列(&str型)
let spaces = spaces.len(); // 同じ名前でusize型の変数を作り直す
println!("空白文字数は: {}文字", spaces);
}Playgroundで開くmutとの違い
| 比較点 | mut |
シャドーイング |
|---|---|---|
| 仕組み | 同じ変数の値を書き換える | letで新しい変数を作る |
| 型の変更 | 不可(エラー: E0308) | 可能 |
| 値の更新方法 | letなしで再代入する |
letで作り直す(再代入ではない) |
補足
mutでは型を変えられない実例
mutな変数への再代入では型を変えられません。
fn main() {
let mut price = "300";
price = price.parse::<i32>().unwrap(); // エラー: E0308(&str型の変数にi32は代入できない)
println!("{}", price);
}Playgroundで開く内側のスコープでのシャドーイング
ブロック内でシャドーイングすると、その効果はブロックの終わりまでです。ブロックを抜けると元の変数が再び見えるようになります。
fn main() {
let price = 300;
{
let price = price * 2; // このブロック内だけ2倍
println!("セット価格: {}円", price); // 600円
}
println!("単品価格: {}円", price); // 300円
}Playgroundで開く定数はシャドーイングできない
letのパターンは定数やstatic項目をシャドーイングできません(The Rust Reference「Scopes」の規定)。定数と同じ名前をletに書くと、変数の宣言ではなく定数の値との照合(定数パターン)と解釈され、エラー: E0005になります。staticの場合は定数パターンとは解釈されず、シャドーイング自体が直接拒否されます(エラー: E0530)。
const TAX_RATE: f64 = 0.1;
fn main() {
let TAX_RATE = 0.08; // エラー: E0005(定数パターンとの照合と解釈され、網羅的でない)
println!("{}", TAX_RATE);
}Playgroundで開くこの辞書が使われているページ
backlinks 4