Introduction Même si Rust fournit son livre Rust, j'ai eu du mal à comprendre le mot-clé . Je me suis demandé : « Suis-je le seul à avoir ce problème ? » Une recherche rapide sur Google a confirmé que je n'étais pas seul. mut En conséquence, j'ai décidé d'écrire cet article pour fournir une explication détaillée du mot-clé . Cet article est destiné à ceux qui proviennent de langages de haut niveau comme Python ou JavaScript. mut Les variables Pour créer une variable non modifiable dans Rust, écrivez simplement . C'est simple. Si vous souhaitez créer une variable qui pourra être mutée ultérieurement, ajoutez simplement le mot-clé après . Rust a une convention utile qui encourage la clarté des intentions. let x = 1337 mut let L'ajout du mot-clé informe les autres que cette variable sera modifiée ailleurs dans le code. D'accord. mut Visualisons-le. Deux variables ici, et . let mut x = 1337 let y = 42 Les references Pour le moment, tout est simple. Cependant, les choses commencent à devenir un peu bouclées lors de l'utilisation de références . Créons-en. mut let mut x = 1337; let y = 42; let x_ref = &mut x; let y_ref = &y; J'ai créé deux références (ou "empruntées" en terme de Rust). L'un d'eux est une référence mutable et l'autre est une référence en lecture seule. Créons à nouveau un schéma pour cela. Dans le schéma donné, j'ai 4 variables, dont 2 sont des références. Les deux variables de référence sont immuables et n'ont pas de mot-clé après , ce qui signifie que je ne peux pas changer ce vers quoi elles pointent. Cependant, je peux toujours modifier la valeur à laquelle ils font référence. mut let *x_ref = 777; Si vous écrivez ceci, le compilateur Rust ne se plaindra pas et la valeur de (pas la référence elle-même) deviendra . Cependant, il y a un carré rouge sur le schéma indiquant que ne dispose pas de l'option de mutabilité. Alors, pourquoi puis-je modifier la valeur à laquelle elle fait référence ? x 777 x_ref Revenons au schéma du . let x_ref = &mut x Le premier bloc blanc contient le nom : . Le second m'informe sur le type stocké dans cette variable. Dans sa forme complète, sans aucune annotation de type implicite, je peux écrire ce qui suit : x_ref let x_ref: &mut i32 = &mut x; Je peux interpréter cela comme : créons une nommée qui contiendra une à et initialisons-la immédiatement avec la à la valeur dans la variable . variable immuable x_ref référence mutable i32 référence mutable i32 x Cela signifie que je peux modifier la valeur vers laquelle elle pointe, mais je ne peux pas modifier la valeur (ou l'adresse) de la référence. En d'autres termes, je ne peux pas écrire quelque chose comme : let x_ref: &mut i32 = &mut x; let mut z = 0; x_ref = &mut z; // Not allowed! En termes de schémas, je souhaite changer la direction vers laquelle pointe la flèche dans le bloc de code ci-dessus. Cependant, même si la variable est mutable, je ne peux pas changer la flèche car le problème réside dans l'immuabilité de la elle-même. z x_ref Pour changer le sens de la flèche, je dois modifier l'adresse stockée dans la variable . Cependant, je ne peux pas le faire car la variable est immuable. x_ref Faisons-le! 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! Il y a trop d'instances de ici autour , n'est-ce pas ? Décrivons-les. mut x_ref : je crée une variable mutable nommée , ce qui signifie que je peux modifier sa valeur plus tard. let mut x_ref x_ref : je déclare que la variable contiendra une ou plusieurs références mutables à une valeur de type . &mut i32 i32 : j'emprunte (obtiens une référence à) la variable . &mut x x Ensuite, j'ai créé une variable nommée et lui ai attribué la valeur . Par la suite, lorsque j'ai écrit , j'ai indiqué que je comprenais que était une variable mutable qui ne pouvait contenir que des références à des valeurs . z 0 x_ref = &mut z x_ref i32 Puisque le type de est , je peux attribuer son adresse à la variable . Pour obtenir l'adresse de , j'ai utilisé la syntaxe . z i32 x_ref z &mut z Le schéma. L'astuce mentale Jetez un oeil à dans la déclaration, cela peut paraître un peu évident, mais… = let mut x_ref = &mut x; … Je le vois comme un diviseur (surtout si vous le faites pivoter de 90 degrés) qui divise l'instruction en deux sous-instructions : gauche et droite. Le côté gauche fournit des informations elle-même, tandis que le côté droit nous renseigne . sur la variable sur la valeur Lorsque j'utilise l'opérateur de déréférencement pour modifier la valeur... * *x_ref = 100; ... Je ne change pas la valeur de la variable . Au lieu de cela, je modifie la valeur à laquelle fait référence. x_ref x_ref Références immuables J'utilisais fréquemment auparavant. Et si j’en oublie certains ? mut let i = 1; let j = 2; let mut k = &i; Puis-je changer la valeur de ici ? En utilisant la technique du diviseur, il est assez simple de répondre. Je peux changer la valeur de (je vois sur le côté gauche), mais la valeur (côté droit) est une référence immuable à (il n'y a pas ici). i k mut i mut Donc… let i = 1; let j = 2; let mut k = &i; k = &j; // This is legal. *k = 3; // This is not. Le schéma. Conclusion Dans cet article, nous avons disséqué les nuances du mot-clé et des références . N'oubliez pas qu'il existe une distinction entre une et une contenant une référence. Notre astuce ? mut référence mutable variable mutable Utiliser le signe comme diviseur mental pour mieux comprendre les missions dans Rust. Cette simple visualisation peut dissiper de nombreuses confusions. = Bon codage !