【Rust入門】ミユーダブル、イミューダブル、シャドーイング

Rustは変数の扱い方に特徴があります。
今回は変数の代入についてです。

Rustは変数の値が書き換えられない

普通のプログラム言語なら変数は自由に書き換えることができますが、Rustでは変数の書き換えが基本的にできません。

実は、今までのサンプルも基本的に変数の書き換えはしていませんでした。

では、試しに変数の値を書き換えをしてみます。
以下の例をご覧下さい。

fn main() {
	let value = 100;
	value = 50;

	println!("value is {}", value);
}

これまでも何回も使っていますが、変数は「let」というキーワードで宣言します。
そして、3行目で変数の値を100から50に書き換えています。
結果はどうなるのかというと、書き換えた部分がコンパイルエラーになります

このようにRustは基本的に値を書き換えることができません。このように変数を書き換えられないことをイミュータブル(immutable)な変数と言います。
ちなみにimmutableとは「不変」という意味です。

変数の値を書き換えるには

変数の値を書き換えられないと言っても全て書き換えられないというわけではありません。
Rustの変数は、デフォルトが書き換え不可になっているだけで、キーワードのmutをつけると、書き換え可能な変数になります。
さきほどの例文は以下のようにするとコンパイルエラーが無くなり実行することができます。

fn main() {
	let mut value = 100;
	value = 50;

	println!("value is {}", value);
}

2行目の「mut」が書き換え可能な変数にするキーワードになります。
mutはmutableの略です。
読み方はミューダブル、日本語では「可変」という意味になります。

mutを使う時の注意

mutを付けると書き換え可能な変数になりますが、何でもmutをつけるのは良くありません。
設計上、書き換えをしない方が安全に動かせるという理由で、デフォルトがイミューダブルになっていることになります。そのため、可能な限りmutは付けずにコーディングするのが良いでしょう。

シャドーイング

変数の値を書き換える方法はもう一つあります。
それはシャドーイングという方法です。
以下のコードを見てください。

fn main() {
	let value = 100;
	println!("value is {}", value);

	let value = 50;
	println!("value is {}", value);
}

これはC言語だと4行目で複数回に渡る変数の宣言で、コンパイルエラーになります。
しかし、Rustではコンパイルエラーになりません。

動作としては、4行目のletで新しく同名の変数が作られることになります。
Rustではデフォルトでは変数の値を書き換えることができないので、letで再定義されるまでは変数の値が変わらないことが保証されます。
これにより変数の値の変化が明確になりデバッグが容易になるということです。

スポンサーリンク