概要
Rustについて勉強し始めたので、メモがてら書いていきたいと思います。
Rustの変数と定数について、それに加えて可変性についてです。
変数と定数
多くのプログラミング言語と同様に、Rustにも変数と定数という概念があります。
簡単に言うと、次の通りです。
- 変数:セットされた値を変更することができる
- 定数:セットされた値は常に変更することができない
ただし、これはかなり雑な説明です。もう少し細かくまとめていきたいと思います。
変数
不変変数(イミュータブル)
Rustでは、let
句を用いて変数を宣言します。
Rustにおける変数は、標準で不変です。
そのため、以下のようなコードを実行するとエラーとなります。
fn main() {
let x = 1;
x = 5; // 不変変数には再代入できないためコンパイルエラーとなる
println!("{}", x);
}
変数が標準で不変であることで、一度宣言した変数が変更されないことはコンパイラにより担保されます。
これは開発を行う上で、コードの可読性などにメリットを与えます。
可変変数(ミュータブル)
同じ変数に対して再代入するためには、let
句の後にmut
オプションをつけます。
(ちなみにmut
はmutable(可変)
の略です。)
mut
オプションを使用すれば、以下のコードのように変数を変更することができるようになります。
fn main() {
let mut x = 1;
x = 5;
println!("{}", x); // コンパイルが通り、5が出力される
}
Shadowing
Rustでは、前に定義した変数と同じ名前の変数を新しく宣言することができます。
この場合、前の変数は新しい変数によって覆い隠されることとなり、これをシャドーイング(Shadowing)と言います。
以下のコードが例です。
fn main() {
let x = 1;
let x = 5;
println!("{}", x); // 同じxという変数を使っているが、再代入しているわけではないため、コンパイルが通り、5が出力される
}
また、Shadowingは同じスコープ範囲内で働きます。
以下は少し複雑な例です。
fn main() {
let x = 1;
{
let x = 5;
println!("{}", x); // コンパイルが通り、5が出力される
}
let x = x + 10; // コンパイルが通り、11(1 + 10の結果)が出力される
println!("{}", x);
}
最後の出力は15(5 + 10の結果)になると思うかもしれませんが、括弧の中は別スコープとなります。
また、Shadowingを利用することで、変数の本質的な意味合いを変えず、型だけ変更することができます。
fn main() {
// 空白文字列から、スペースがいくつ入っているかを保持する
let spaces = " ";
let spaces = spaces.len();
}
Shadowingのメリットは以下です。
- 可変変数ではないため、宣言後は不変となる
-
let
句を使わずに再代入しようとするとコンパイルエラーとなる - 内容を変更せず、型だけ変えることができる
定数
定数は、変数と違いconst
句を使用して定義します。
そして定数を宣言する場合は、必ず型を指定する必要があります。
fn main() {
const X: i8 = 100;
println!("{}", X); // コンパイルが通り、100が出力される
}
以上のようにデータを扱う際には、変数なのか定数なのか、可変なのか不変なのか、などを常に注意する必要があります。
なんでも可変変数で宣言してしまう、などということはしないようにしましょう。