0Pricing
Learn Rust Coding · レッスン

シャドーイング

変数の再束縛

「シャドーイング」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

シャドーイングとは

シャドーイングとは、前に宣言した変数と同じ名前で新しい変数を宣言することです。新しい束縛が古い束縛を「隠します」。

同じ名前でletを繰り返し使用することで行います。

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("x is {}", x);
}

シャドーイングはミューテーションではない

シャドーイングでは、まったく新しい変数が作成されます。これは、同じ変数を再利用するmutとは異なります。

それぞれのletが新しい束縛になるため、値の型を変えることもできます。

fn main() {
    let y = 10;        // immutable
    let y = y + 5;     // new binding, also immutable
    println!("y is {}", y);
}

シャドーイングによる型の変更

シャドーイングの強力な使い方の1つは、名前を維持したまま型を変更することです。

ここでは、同じ名前のまま文字列を数値にパースしています。

fn main() {
    let spaces = "   ";
    let spaces = spaces.len();
    println!("count is {}", spaces);
}

mutで型を変更できない理由

mutでは値を変更できますが、型は変更できません。

次のコードはコンパイルに失敗します。

  • let mut spaces = " ";
  • spaces = spaces.len(); — 型の不一致エラーです。

シャドーイングでは新しい変数を作成するため、この問題を回避できます。

fn main() {
    let mut count = 3;
    count = 4; // ok, same type
    println!("{}", count);
}

内部スコープでのシャドーイング

内部ブロック内で変数をシャドーイングできます。ブロックが終了すると、外側の束縛が再び見えるようになります。

fn main() {
    let n = 1;
    {
        let n = n * 10;
        println!("inner {}", n);
    }
    println!("outer {}", n);
}

段階的な変換

シャドーイングを使うと、1つの分かりやすい名前を維持したまま、値を複数の段階にわたって変換できます。

fn main() {
    let input = "42";
    let input: i32 = input.trim().parse().unwrap();
    let input = input * 2;
    println!("result {}", input);
}

シャドーイングで不変性を維持する

シャドーイングされた各束縛は不変のままです。変換後も、x2やx_tempのような新しい名前を作らずに、不変性による安全性を維持できます。

fn main() {
    let price = 100;
    let price = price - 20;   // discount applied
    let price = price + 5;    // shipping added
    println!("final price {}", price);
}

異なるロジックでのシャドーイング

関数呼び出しや式を含め、どのような方法でも新しい値を計算できます。

fn main() {
    let text = "hello";
    let text = text.to_uppercase();
    println!("{}", text);
}

混乱を避ける

シャドーイングは便利ですが、使いすぎると読み手を混乱させることがあります。同じ概念を明確に変換する各段階で使用し、単に名前を無作為に使い回す目的では使用しないでください。

fn main() {
    let raw = "  Rust  ";
    let raw = raw.trim();      // clean version
    println!("[{}]", raw);
}

シャドーイングと再代入のまとめ

名前に新しい値を与える方法は2つあります。

  • シャドーイング:let x = ...;をもう一度記述します。新しい変数になり、型を変更でき、不変のままです。
  • 再代入:mutを付けてx = ...;と記述します。同じ変数なので、同じ型である必要があります。
fn main() {
    let val = "7";
    let val: i32 = val.parse().unwrap(); // shadow + type change
    let mut val = val;
    val += 1;                            // reassign, same type
    println!("{}", val);
}

実践的な例

ユーザーデータの読み取りと変換は、シャドーイングがよく使われる典型的な場面です。型がテキストから数値に変わっても、意味のある名前ageを維持できます。

fn main() {
    let age = "25";
    let age: u32 = age.parse().unwrap();
    let age = age + 1; // next birthday
    println!("next year you will be {}", age);
}

理解度チェック

シャドーイングとmutの違いを確認しましょう。

まとめ

Rustのシャドーイング:

  • 同じ名前でletを繰り返すと、新しい束縛が作成されます。
  • 新しい束縛には、異なる型を指定できます。
  • シャドーイングされた各値は不変のままです。
  • 同じ変数を変更し、その型を維持するmutとは異なります。
fn main() {
    let data = "100";
    let data: i32 = data.parse().unwrap();
    let data = data / 4;
    println!("final {}", data);
}

よくある質問

「シャドーイング」レッスンは無料ですか?

はい。「シャドーイング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「シャドーイング」で何を学びますか?

変数の再束縛 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「シャドーイング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. letと可変性
  2. スカラー型
  3. 複合型
  4. シャドーイング
← Learn Rust Codingに戻る