CやJavaScriptのような多くの人気プログラミング言語では、変数はデフォルトで可変です。Rustでは、言語の作者がデフォルトで変数を不変にするという重要な選択をしました。この決定は、コードの安全性や変数の状態に関して予期しない変更に関連するエラーの数を減らすことに関連しています。
可変変数の主な問題は、暗黙的な値の変更に関連するバグのデバッグと探査が難しいことです。特に、異なるプログラムの部分で変数が変更され、その変更の制御が失われるとき、コードの挙動を理解するのは難しいです。これは、バグや予期しない結果を引き起こす可能性があり、特にマルチスレッドアプリケーションを作成する際やコード内の複雑な相互依存関係がある場合において問題になります。
Rustでは、letキーワードを使用して変数はデフォルトで不変です。変数を可変にするには、明示的にmutと指定する必要があります。これにより、コードの信頼性が向上し、不変性が意識的な選択になり、偶発的な変更の可能性が減少します。
コード例:
let x = 5; // 不変変数 let mut y = 10; // 可変変数 y += 1; // 正常 x += 1; // コンパイルエラー!
主な特徴:
mutによる可変性の明示的な指定。構造体の変数が不変として宣言されている場合、構造体のフィールドを変更できますか?
いいえ、構造体の変数が不変として宣言されている場合、そのフィールドも不変です。フィールドを変更するには、mutで変数を宣言する必要があります。
コード例:
struct Point { x: i32, y: i32 } let mut p = Point { x: 0, y: 0 }; p.x = 5; // ok let p2 = Point { x: 1, y: 2 }; p2.x = 3; // コンパイルエラー!
変数がmutである場合、同時に複数の可変参照をその変数にすることはできますか?
いいえ、Rustではオブジェクトに対して同時に一つの可変参照しか存在できません。このルールは、データ競合の状態を防ぎます。
不変オブジェクトの配列を可変として宣言し、その内容を変更できますか?
はい。配列の変数がmutとして宣言されている場合、その要素を変更できますが、配列の型の内容が可変性をサポートしていない場合、要素は不変です。
mutを使用することにより、コードが安全でなくなります。mutを宣言せずに変数の内容を変更しようとすること。プロジェクトでは、習慣的に変数を可変として宣言するが、実際にはその必要がありません。そのため、一つの変数がプログラムの途中で他のメソッドによって偶然に変更され、難解なバグが本番環境で発生します。
メリット:
デメリット:
チームプロジェクトでは、デフォルトで変数は不変であり、可変性は絶対に必要な場合にのみ使用し、その理由を説明するコメントを必ず追加するルールを守ります。
メリット:
デメリット: