イントロ Rust は Rust ブックを提供していますが、私は キーワードを理解するのに苦労しました。 「この問題を抱えているのは私だけでしょうか?」と自問しました。 Google で簡単に検索したところ、私が一人ではないことがわかりました。 mut その結果、 キーワードについて詳しく説明するためにこの記事を書くことにしました。この記事は、Python や JavaScript などの高級言語を使用するユーザーを対象としています。 mut 変数 Rustで変更不可能な変数を作成するには、単に と書くだけです。それは簡単です。後で変更できる変数を作成したい場合は、 の後に キーワードを追加するだけです。 Rust には、意図を明確にするための便利な規約があります。 let x = 1337 let mut キーワードを追加すると、この変数がコード内の別の場所で変更されることが他の人に通知されます。わかった。 mut それを視覚化してみましょう。ここでは 2 つの変数、 および 。 let mut x = 1337 let y = 42 参考文献 現時点では、すべてが簡単です。ただし、 参照を使用すると、状況が少し複雑になり始めます。いくつか作成してみましょう。 mut let mut x = 1337; let y = 42; let x_ref = &mut x; let y_ref = &y; 2 つのリファレンスを作成しました (Rust の用語で「借用」)。それらの 1 つは変更可能な参照であり、もう 1 つは読み取り専用の参照です。そのためのスキームをもう一度作成しましょう。 指定されたスキームには 4 つの変数があり、そのうち 2 つは参照です。どちらの参照変数も不変で、 の後に キーワードがありません。つまり、それらが指すものを変更することはできません。ただし、参照される値は変更できます。 let mut *x_ref = 777; これを書くと、Rust コンパイラは文句を言わず、 の値 (ref 自体ではない) が に変更されます。ただし、スキームには赤い四角形があり、 に可変性オプションがないことを示しています。では、なぜ参照する値を変更できるのでしょうか? x 777 x_ref のスキームに戻りましょう。 let x_ref = &mut x 最初の白いブロックには、 という名前が含まれています。 2 番目のメッセージは、その変数に格納されている型について通知します。暗黙的な型アノテーションのない完全な形式では、次のように記述できます。 x_ref let x_ref: &mut i32 = &mut x; これは次のように解釈できます への を保持する という名前の を作成し、 変数内の 値への を使用して直ちに初期化しましょう。 i32 変更可能な参照 x_ref 不変変数 x i32 変更可能な参照 これは、参照が指す値は変更できますが、参照の値 (またはアドレス) は変更できないことを意味します。つまり、次のようなことは書けません。 let x_ref: &mut i32 = &mut x; let mut z = 0; x_ref = &mut z; // Not allowed! スキームに関しては、上記のコード ブロックで矢印が指している方向を変更したいと思います。ただし、 変数が変更可能であっても、問題は 自体の不変性にあるため、矢印を変更することはできません。 z x_ref 矢印の方向を変更するには、 変数に格納されているアドレスを変更する必要があります。ただし、変数は不変であるため、これを行うことはできません。 x_ref やりましょう! let mut x: i32 = 1337; let mut x_ref: &mut i32 = &mut x; // I've added mut before x_ref let mut z = 0; x_ref = &mut z; // Allowed! の周りには のインスタンスが多すぎますよね?それらについて説明しましょう。 x_ref mut : という名前の可変変数を作成しています。これは、後でその値を変更できることを意味します。 let mut x_ref x_ref : 変数には 型の値への変更可能な参照が含まれると述べています。 &mut i32 i32 : 変数 を借用しています (参照を取得しています)。 &mut x x 次に、 という名前の変数を作成し、値 を割り当てました。その後、 と書いたとき、 値への参照のみを保持できる可変変数であると理解していることを示しました。 z 0 x_ref = &mut z x_ref i32 の型は なので、そのアドレスを 変数に割り当てることができます。 のアドレスを取得するには、 構文を使用しました。 z i32 x_ref z &mut z その計画。 メンタルトリック ステートメント内の を見てください。少し明白に見えるかもしれませんが… = let mut x_ref = &mut x; …私はこれを、ステートメントを 2 つのサブステートメント (左と右) に分割する分割線 (特に 90 度回転した場合) として見ています。左側は 情報を示し、右側は 示します。 変数自体に関する 値について 逆参照演算子を使用して値を変更すると... * *x_ref = 100; ... 変数の値は変更しません。代わりに、 が参照している値を変更しています。 x_ref x_ref 変更不可能な参照 以前は よく使っていました。それらの一部を省略した場合はどうなりますか? mut let i = 1; let j = 2; let mut k = &i; ここで の値を変更できますか?除算テクニックを使用すると、答えるのは非常に簡単です。 の値は変更できますが (左側に 表示されます)、値 (右側) は への不変参照です (ここには はありません)。 i k mut i mut したがって… let i = 1; let j = 2; let mut k = &i; k = &j; // This is legal. *k = 3; // This is not. その計画。 結論 この記事では、 キーワードと参照のニュアンスを詳しく説明しました。 と参照を保持する には違いがあることに注意してください。私たちのトリック? mut 可変参照 可変変数 記号を精神的な区切り線として使用すると、Rust での代入をよりよく理解できます。このシンプルな視覚化により、多くの混乱が解消されます。 = コーディングを楽しんでください!