メインコンテンツにスキップ
モジュール 1 · レッスン 1 / 2コース内の 1/14~10 min
モジュールのレッスン (1/2)

変数と可変性

Rust では、変数とメモリの管理は、安全性と制御という 2 つの基本原則によって導かれます。このため、他の多くのプログラミング言語とは異なり、Rust の変数は デフォルトで不変です。

これは、変数に値が割り当てられると、その値を変更することはできないことを意味します。これを変更しようとすると、コンパイラによってエラーが発生します。

不変変数と mut キーワード

変数を宣言するには、let キーワードを使用します。

Rust
let x = 5; // Immutable by default
// x = 6; // ERROR! The compiler will refuse to build this code.

変数の値を変更する必要がある場合は、let の直後に mut キーワードを使用して、変数を明示的に変更可能にする必要があります。

Rust
let mut y = 10; // Mutable
println!("Il valore di y e: {}", y);
y = 15; // Valid!
println!("Il valore modificato di y e: {}", y);

mut プレフィックスを使用すると、コンパイラとコードを読む人に、実行中に値が変更されることが明確に伝わります。

シャドーイング

Rust では シャドウイング の概念も許可されています。これは、let キーワードを再度使用して、同じ名前の変数を再宣言することです。新しい変数は前の変数を「影」にします (またはカバーします)。

Rust
let x = 5;
let x = x + 1; // Shadowing: x is now 6
let x = x * 2; // Shadowing: x is now 12

mut とは異なり、シャドウイングでは次のことが可能です。

  1. 同じ名前を維持したまま、変数のデータ型を変更します。
  2. 変換後も変数の不変性を維持します。
Rust
let spaces = "   "; // Type: &str (string)
let spaces = spaces.len(); // Type: usize (number)

シャドーイングとスコープの有用性

シャドウイングは同じブロックに限定されません。ネストされたブロック ({}) 内で使用して、値を一時的にオーバーライドできます。内側のブロックが終了すると、元の変数が再び表示されます。

Rust
let x = 5;
{
    let x = x * 2; // Shadowing valid only inside the block
    println!("Value in the inner block: {}", x); // Prints 10
}
println!("Value in the outer block: {}", x); // Prints 5

このメカニズムは完全にコンパイル時に実行されるため、非常に安全かつ効率的であり、実行時のパフォーマンスのオーバーヘッドなしで型の安全性が確保されます。


自分で試してみてください

運動#rust.m1.l1.e1
試行回数: 0読み込み中…

x という名前の可変変数を初期値 5 で宣言します。次に、x に 10 を加算し、println! を使用してそれを画面に出力します。マクロ。

エディターを読み込み中…
ヒントを表示

`let mut x = 5;` で変数を宣言し、次に `x += 10;` (または `x = x + 10;`) で変数をインクリメントし、最後に `println!('{}', x);` で出力します。

3 回の試行後に解決策が利用可能になります

運動#rust.m1.l1.e2
試行回数: 0読み込み中…

値 10 を持つ不変変数 y を宣言します。 let で再度宣言して y をシャドウし、前の値を 2 倍し、最後に println! を使用して出力します。

エディターを読み込み中…
ヒントを表示

Use `let y = 10;`, then shadow it by declaring it again with `let y = y * 2;` and finally use `println!` to display it.

3 回の試行後に解決策が利用可能になります

運動#rust.m1.l1.e3
試行回数: 0読み込み中…

Declare an immutable variable named input containing the string value "42". Shadow input by declaring it as an integer of type i32, converting the original value via input.parse::<i32>().unwrap(). Finally, print it using the println! macro.

エディターを読み込み中…
ヒントを表示

Declare `let input = "42";`, then shadow it with `let input: i32 = input.parse().unwrap();` and print it using `println!("{}", input);`.

3 回の試行後に解決策が利用可能になります