TIL

Today I Learned. 知ったこと、学んだことを書いていく

変数と変数可能性 - Rust

Rustにおける変数の基礎について、公式ドキュメントを見ながらまとめてみた(まとまってはいないけど)


  • 不変変数として宣言されていることで、その変数は変更されないことが保証される。プログラミング中やコードを読んでいるときに、値が変更されるかどうかを宣言の文を見れば把握できる。
  • 可変変数にするにはmutキーワードをつけて宣言する
// 不変変数の`x`を宣言
let x = 5;
println!("The value of x is: {}", x);
// 不変変数に再度代入しようとしているためエラー
x = 6;
println!("The value of x is: {}", x);

// mutで値を変更可能になる
let mut y = 5;
println!("The value of y is: {}", y);
y = 6;
println!("The value of y is: {}", y);

定数

  • 定数と変数の違いは定数は常に不変。変数はデフォルトで不変
  • 定数にはmutを使うことはできない(可変にはできない)
  • 宣言時にはletの代わりにconstを使う
  • 必ず型注釈をつける
const MAX_POINTS: u32 = 100_000;

変数を覆う(シャドーイング)

  • 以前に宣言した変数を新しい変数として再度宣言することができる機能
  • mutキーワードとは区別される。なぜなら、シャドーイングの場合には、その後も不変であるが、mutはその後も可変であるため。
// shadowing
let x = 1;
let x = x * 2;
println!("The value of x is: {}", x);

// これはコンパイルエラーになる
x = x + 4;

// mutキーワード
let mut y = 1;
y = y + 2;
println!("The value of y is: {}", y);
  • mutでは再代入の時に型を変更できない。しかし、シャドーイングだと新しい変数を作成していることになるため、型の変更ができる。
// change type
let spaces = "    ";
let spaces = spaces.len();  // OK

let mut spaces2 = "    ";
spaces2 = spaces2.len();    // compile error

参考文献

変数と変更可能性 - 錆プログラミング言語