見出し画像

Rust スコープとシャドーイングとは 使い方と注意点について

Rustにおけるスコープとシャドーイングは、変数の有効範囲や変数名の再利用に必要な概念です。

スコープ

スコープは変数や構造体などの識別子が有効である範囲を定義します。
Rustでは、ブロック構造を持つすべてのコードでスコープが存在します。スコープが終了すると、スコープ内の変数やリソースは解放されます。

fn main() {
    let x = 10; // この変数xはメイン関数のスコープ内で有効

    {
        let y = 20; // この変数yはこのブロック内でのみ有効
        println!("x: {}, y: {}", x, y); // xとyの両方がこのスコープで有効
    }

    // ブロックが終了するとyは無効になる
    // println!("{}", y); // コンパイルエラー:yはスコープ外
}

内側のスコープでは外側のスコープの変数にアクセスできますが、逆はできません。

また、スコープが終了すると、ミュータブルな変数の変更も含めて、スコープ内の変数やリソースは解放されます。


シャドーイング

シャドーイングは同じ名前の変数を異なるスコープで再宣言することを指します。
Rustでは、シャドーイングを利用して、同じ名前の変数に異なる値を割り当てることができます。

fn main() {
    let x = 5;
    let x = x + 1; // シャドーイングによってxの値を変更
    {
        let x = x * 2; // 内側のスコープで再びシャドーイング
        println!("x in inner scope: {}", x); // xは12
    }
    println!("x in outer scope: {}", x); // xは6
}

シャドーイングでは、新しい変数として再宣言されるため、変更の際にミュータブルである必要はありません。

また、内側のスコープでシャドーイングされた変数は、スコープ外に影響を与えません。


注意点

スコープとライフタイム

スコープはRustの所有権とライフタイムのルールに直結しています。スコープが終了すると、変数やリソースが解放されるため、参照やポインタは無効になります。

スコープ外のリソースを参照しようとすると、コンパイルエラーや未定義の動作が発生します。


シャドーイングの乱用

シャドーイングは便利ですが、乱用するとコードの可読性が低下します。
特に、同じ名前の変数が異なるスコープで何度も再宣言されると、変数の意味が曖昧になり、デバッグが難しくなることがあります。


Rustをもっと詳しくなりたい方に

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!

個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。
プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。
内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。
プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。

Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。


基礎から学ぶRustプログラミング入門

本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています

この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?