🦀

Rustにおける変数・定数・シャドーイング

2023/12/25に公開

はじめに

筆者は勉強中のため、解釈が間違っている可能性があります。
間違いや誤植等発見されましたらご指摘のほどよろしくお願いいたします。

変数

変数宣言

letはRustにおいて変数を宣言する際に使用される句である。

Rustにおいて変数はデフォルトで不変であり、同じ変数に対して再代入をするためには、
宣言時にmutオプションを付けなければならない。

コード例:

fn main() {
    let immutable_val = 57;
    immutable_val = 2; // Rustコンパイラは再代入できないことを表すエラーを吐く。
    println!("変数の中身: {}", immutable_val)
}
fn main() {
    let mut mutable_val = 57;
    mutable_val = 2;
    println!("変数の中身: {}", mutable_val)
} // コンパイルは成功し、”変数の中身: 2”と表示される。

変数がデフォルトで不変であることのメリット

値が不変であることのメリットは、一度宣言した後にその変数の値が本当に変更されないことを
コンパイラによって担保してもらうことにある。

コードを書く際に宣言された変数がどこで変更されているかを追いかける必要がなくなり、
開発体験が向上するためRustは変数のデフォルトを不変としていると考えられる。

定数

定数は宣言されたスコープ内*1において常に不変な値のこと。

変数との違い

  • 定数に対しては先ほどのmut句は使用することができず、常に不変であることが保証されている。
  • let句の代わりにconst句を使用。
  • 必ず型注釈をしなければならない。
  • 関数呼び出し結果や、実行時に評価される値をセットすることはできない。

必ず型注釈をしなければならない

Rustにおいて定数は宣言時必ず束縛される値の型を注釈する必要があります。

例:

const MAX_HELTH = 100_000 // エラーとなる。 Syntax Error: missing type for `const` or `static`

const MAX_HELTH: u32 = 100_000 // MAX_HELTHの値が20にセットされる。

関数呼び出し結果や、実行時に評価される値をセットすることはできない。

定数に関数の呼び出し結果等を束縛することはできません。

const MAX_HELTH: u32 = player_helth(); // 関数の返り値がどんなものでもエラーとなる。

定数を使うメリット

定数は値をハードコード*2する場合のベストプラクティスであり、
プログラムのいろいろなところで参照される可能性のある値を定義するのに使用されます。

定数を使用することにより、将来的に値を変える必要が出た際、一か所の変更をするだけで済むようにできます。

シャドーイング(shadowing)

シャドーイング(shadowing)とは、同じスコープ*1内にて前に宣言した変数と同じ名前を利用して新たな変数を再宣言できる機能です。

Rustでは再宣言することを1番目の変数を”覆い隠す”と表現することがあります。

例:

fn main() {
    let x = 5;
    let x = x + 1;
} // この場合mutではなくても覆い隠すことができることは留意すべき事項です。

シャドーイングと可変(mutable)変数の違い

シャドーイングは、可変オプションを付けた変数と似ていますが、本質は違います。

シャドーイングでは、再宣言をするため使用する型ごと変更することができます。

そのため、以下の例のように”本質的に値は変わらないが型を変えたい”変数に使用することが
想定されています。

fn main() {
    let five = "5"; // この時点での変数は&str型
    let five: i32 = five.parse().unwrap(); // fiveの中身である"5"をi32型に変換し再宣言
}

シャドーイングを使うメリット

シャドーイングを使用すると、型を変更したいが内容は変えないような変数を同じ名前で使うことができます。

これにより変数名の節約ができ、本質的に同じものの変数名を同一化することができます。

用語について

*1 スコープ

スコープ(英:scope)とは

「範囲」をカッコ付けて言った表現。

あるいは

プログラミングの世界で登場する用語で「おまえの名前が通じるのは、ここまでだ!」な影響範囲のこと

スコープ - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

*2 ハードコード

ハードコード(英:hard code)とは

「ハードコーディング」のこと。

用語の中身としては

別のところに分けておいた方が良いであろう処理や値をソースコードの中に直接埋め込むこと

ハードコード - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

参考・引用

The Rust Programming Language 日本語版

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

Discussion