導入
Rust の変数には、他の多くの言語と大きく違う特徴があります。変数は既定で「変更できない(イミュータブル)」 のです。うっかり値を書き換えてしまうバグを、言語のレベルで防ぐための設計です。
説明
変数は let で宣言します。値を後から変えたいときは、mut(mutable = 変更可能)を明示的に付けます。
fn main() {
let x = 5;
// x = 6; // ← これはコンパイルエラー! x は変更できない
let mut y = 5; // mut を付けたので変更できる
y = 6; // OK
println!("x = {x}, y = {y}");
}
let x = 5;… 変更不可の変数。あとでx = 6と書くと コンパイルエラーになります。let mut y = 5;…mutを付けると再代入できます。- 「変えないものはそのまま、変えるものだけ
mutを付ける」——このおかげで、コードを読むだけで「この値は途中で変わるのか?」がひと目で分かります。
もうひとつ、Rust には シャドーイング(shadowing) という機能があります。同じ名前で let を書き直すと、前の変数を「覆い隠して」新しい変数を作れます。
fn main() {
let count = 5;
let count = count + 1; // 前の count を隠して新しい count(6)を作る
let count = count * 2; // さらに隠して 12
let spaces = " "; // 文字列型
let spaces = spaces.len(); // 数値型に「変身」できる(別の変数だから)
println!("count = {count}, spaces = {spaces}");
}
mut による再代入と違い、シャドーイングは毎回あたらしい変数を作るので、型を変えることもできます。上の spaces は文字列 → 数値へと型が変わっていますね。
試すには
let x = 5; のあとに x = 6; を足すと、コンパイラが cannot assign twice to immutable variable(不変な変数に二度代入できない)と教えてくれます。let mut x = 5; に直すとエラーが消えます。