変数
Rustでは、変数は基本的に不変(immutable)です。Rustは安全性を重視しているため、変数はデフォルトで不変となっています。
したがって、一度宣言された変数の値を変更しようとすると、コンパイルエラーが発生します。
fn main() {
let x = 5;
println!("The value of x is: {x}");
x = 6; // error!
println!("The value of x is: {x}");
}
このコードをコンパイルしようとすると、エラーメッセージが表示されます。
このように、let
で作成された変数はデフォルトで不変なので、変数の値を変更するにはmut
キーワードを使って可変(mutable)であることを明示する必要があります。
fn main() {
let mut x = 5;
println!("The value of x is: {x}");
x = 6;
println!("The value of x is: {x}");
}
定数(Constants)
前述の変更できない変数と同様に、定数(constant)も不変です。しかし、変数とはいくつかの違いがあります。
まず、定数にはmut
キーワードを使うことはできません。そして、必ずデータ型を指定する必要があります。
例として、次のように書くことができます。
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
この定数は、プログラムが実行される間、常に変更できない値です。定数はコード全体で使用され、グローバルスコープでも定義できます。
シャドーイング(Shadowing)
Rustでは、変数をシャドーイングすることが可能です。これは、同じ名前の変数を再宣言して、まったく新しい変数として扱うことを意味します。
fn main() {
let spaces = " ";
let spaces = spaces.len();
}
最初のspaces
は文字列型ですが、シャドーイングによって2番目のspaces
は整数型になります。
let mut
との違いは、let mut
を使うと値を変更することはできますが、異なるデータ型に変更することはできないという点です。
let mut spaces = " ";
spaces = spaces.len(); // error: mismatched types
シャドーイングは、変数の名前を再利用しつつ異なる型の値を持たせたいときに便利です。これにより、同じスコープ内で変数名を統一しつつも、柔軟に異なる値を扱うことができます。