Rustの特徴として、変数は、標準で不変になっており、以下のようコードの場合は、エラーとなります。
fn main() {
let x = 5;
println!("The value of x is: {}", x); // xの値は{}です
x = 6;
println!("The value of x is: {}", x);
}
変数が不変であるということは、値が名前に束縛され、その値を変えることができません。
ただ、だからといって絶対不変でなければいけないというわけでもなく、mutってというものを使うと、可変にできます。
let mut x = 5;
でも、変数と定数の違いはなんだろうとプログラミングをやっている人だったら、疑問に思うかもしれません。一番の違いは、定数は、プログラムが走る期間、定義されたスコープ内でずっと有効です。従いまして、プログラミングでいろいろと使用される可能性がある値は、変数より、定数に定義したほうが、あとあと、メンテンスする際に楽になるかと思います。
もう一つ、Rustの変数の扱いで面白い機能が「シャドーイング」という機能があります。これは、簡単にいうと前に定義した変数と同じ名前の変数を新しく宣言でき、新しい変数は、前の変数を覆い隠すことができます。例えば、こんなコードになります。
fn main() {
let x = 5;let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x);
}
このコードをみるとわかりますように変数の前に、letをつけてあげれば、覆い隠すことができます。mutと同じ機能のように感じてしまうかもしれませんが、違いは、まず、一時的に変数を可変にしたいときは、letを使うといいです。もう一つの違いは、再度letキーワードを使用したら、実効的には新しい変数を生成していることになるので、 値の型を変えつつ、同じ変数名を使いまわせることです。mutを使うとデータ型がstrかnumかなど気にする必要があるケースがあります。
変数と可変性については、Rustの基本のところなので、しっかり理解するといいかもしれません。