Progrust Library.

// 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

  1. 辞書ループラベル
  2. 辞書変数
  3. 動かして学ぶRustプログラミング問題集 › 第1章 コンソール出力と変数
  4. 動かして学ぶRustプログラミング問題集 › 第7章 所有権とムーブ