本文へスキップ
BecomeCoder

Rustコース · 第1章 Rustをはじめる · レッスン2

変数とミュータビリティ ― let と mut

ブラウザで完結

導入

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; に直すとエラーが消えます。

実際に動かしてみよう

下のエディタにRustを書いて「実行」を押すと、学習用シミュレータが println! の出力を表示します(本物のrustcではなく、教材の範囲を再現した軽量エンジンです)。struct・enum・match・トレイト・Vec/String/HashMap・Option/Result なども動きます。本文の例を書き換えて動かしてみましょう(所有権・借用チェッカーのコンパイルエラーは再現しないため、動きの確認用として使ってください)。

Rust — ブラウザ内で実行(学習用シミュレータ)

Rustの教材サブセットを動かす学習用シミュレータを読み込みます(本物のrustcではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。