変数とは #
プログラミングにおける「変数」とはデータを一時的に保存しておくための「箱」としてよく表現されます。
プログラムの実行中に数値や文字列などの値を一時的に記憶し、必要に応じてその値を取り出し使用する役割を担っています。
変数を活用することで、同じ値を繰り返し使用したり、状況に応じて動的に値を変更したりすることが可能になります。
一般的なプログラミング言語では、変数(箱)を作成する際に任意の名前を付けることができ、この名前を使って変数を呼び出す事ができます。
このように、変数に名前を付けて値を保持する仕組みそのものを、変数の定義(変数宣言)と呼びます。
変数はプログラミング言語ごとに、その性質や扱い方に違いがあります。
多くのプログラミング言語では、変数に値を入れたあと、何度でもその値を書き換えることができます。
一方、Rustでは、変数はデフォルトで不変として扱われます。
その為、一度値を入れると、その値を書き換えることはできません。
値を複数回変更する場合は変数宣言時に明示的に可変であることを宣言する必要があります。
これは、プログラムの安全性と予測可能性を高めるための設計となっております。
以下は主要プログラミング言語における変数のデフォルトの可変性を比較した表です。
言語 | デフォルトの可変性 |
---|---|
Rust | 不変 |
Java | 可変 |
C++ | 可変 |
Python | 可変 |
JavaScript | 可変 |
Go | 可変 |
Swift | 可変 |
Kotlin | 不変 |
Scala | 不変 |
Haskell | 不変 |
基本となる変数宣言 #
Rustにて変数を宣言するには let
キーワードを使用します。
以下は、基本的な変数の宣言方法となります。
let 変数名 = 値;
例えばx
という名前で変数を作成し整数5
を代入する場合は以下となります。
let x = 5;
この場合、変数はデフォルトで不変となるため、宣言後に値を変更することはできません。
例えば、以下のように一度宣言した変数に対して、後から別の値を代入する処理を実行してみます。
fn main() {
let x = 5;
println!("初期値: {}", x);
x = 20;
println!("再代入: {}", x);
}
このコードをrustc
でコンパイルすると、次のようなE0384
エラーが出力されます。
error[E0384]: cannot assign twice to immutable variable `x`
--> main.rs:4:5
|
2 | let x = 5;
| - first assignment to `x`
3 | println!("初期値: {}", x);
4 | x = 20;
| ^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
2 | let mut x = 5;
| +++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0384`.
これは不変である変数に対して値の再代入を行おうとしているために発生したエラーとなります。
より詳しい情報は、公式ドキュメントのエラー解説ページをご確認お願いいたします。
公式ドキュメントこの問題を解決するには変数宣言時に明示的に可変である事を記述する必要があります。
具体的な方法は次のセクションにて解説いたします。
可変として変数を宣言する #
値を後から変更したい場合は、let
に加えてmut
キーワードを使用します。
以下は、可変として変数を宣言する方法となります。
let mut 変数名 = 値;
例えばx
という名前で変数を作成し可変として宣言する場合は以下となります。
let mut x = 5;
前のセクションでエラーとなったコードに対して、以下のようにmut
キーワードを追加します。
fn main() {
let mut x = 5;
println!("初期値: {}", x);
x = 20;
println!("再代入: {}", x);
}
次に、修正したファイルをコンパイルして実行すると、以下のような結果が得られます。
$ rustc main.rs
$ ./main
初期値: 5
再代入: 20
この結果から、mut
を指定することで変数が可変となり、初期値として代入した 5
を、後から20
に変更できるようになったことが分かります。
今回紹介したコードは下記にて実行可能です。