スコープ

Rustでは、スコープ(scope)は変数や関数などの要素が有効である範囲を指します。スコープを理解することで、プログラムの構造や変数のライフタイムをよりよく管理できます。

スコープの基本

Rustでは、{}で囲まれた領域がスコープを形成します。スコープ内で宣言された変数は、そのスコープ内でのみ有効です。

fn main() {
    let x = 5; // xはこのスコープ内で有効
    {
        let y = 10; // yはこの内側のスコープ内で有効
        println!("x: {}, y: {}", x, y); // xとyは両方ともここで使用可能
    }
    // println!("y: {}", y); // エラー: yはこのスコープでは無効
}

サンプルコードの編集

上記のコードはUndo changesボタンを押すことで編集可能です。 スコープ外で変数が無効であることを試して見てください。

グローバルスコープとローカルスコープ

  • グローバルスコープ:プログラム全体で有効なスコープです。通常、関数外で宣言された定数や関数が含まれます。
  • ローカルスコープ:特定のブロックや関数内でのみ有効なスコープです。
const GLOBAL_CONST: i32 = 100; // グローバルスコープ

fn main() {
    let local_var = 50; // ローカルスコープ
    println!("Global: {}, Local: {}", GLOBAL_CONST, local_var);
}

スコープのネスト

スコープはネストすることができ、内側のスコープから外側のスコープの変数にアクセスできますが、その逆はできません。

ネストとは?

ここでのネストは、スコープの中にスコープが入る状態を示しています。

fn main() {
    let outer = "outer";
    {
        let inner = "inner";
        println!("Outer: {}, Inner: {}", outer, inner); // 両方の変数にアクセス可能
    }
    // println!("Inner: {}", inner); // エラー: innerはこのスコープでは無効
}

シャドーイング

Rustでは、同じ名前の変数を再度宣言することができます。これをシャドーイング(shadowing)と呼びます。

fn main() {
    let x = 5;
    let x = x + 1; // シャドーイング
    {
        let x = x * 2; // 内側のスコープで再度シャドーイング
        println!("Inner x: {}", x); // Inner x: 12
    }
    println!("Outer x: {}", x); // Outer x: 6
}