Introducción Aunque Rust proporciona su libro Rust, tuve dificultades para comprender la palabra clave . Me pregunté: "¿Soy el único que tiene este problema?" Una búsqueda rápida en Google confirmó que no estaba solo. mut Como resultado, decidí escribir este artículo para brindar una explicación detallada de la palabra clave . Este artículo está destinado a quienes provienen de lenguajes de alto nivel como Python o JavaScript. mut Las variables Para crear una variable inmutable en Rust, simplemente escriba . Es sencillo. Si desea crear una variable que pueda modificarse más adelante, simplemente agregue la palabra clave después de . Rust tiene una convención útil que fomenta la claridad de intenciones. let x = 1337 mut let Agregar la palabra clave informa a los demás que esta variable se modificará en otra parte del código. Bueno. mut Visualicémoslo. Dos variables aquí, y . let mut x = 1337 let y = 42 Las referencias Por el momento todo es sencillo. Sin embargo, las cosas empiezan a ponerse un poco complicadas cuando se utilizan referencias . Creemos algunos. mut let mut x = 1337; let y = 42; let x_ref = &mut x; let y_ref = &y; Creé dos referencias (o "tomé prestadas" en términos de Rust). Una de ellas es una referencia mutable y la otra es una referencia de solo lectura. Creemos un esquema para eso nuevamente. En el esquema dado, tengo 4 variables, 2 de las cuales son referencias. Ambas variables de referencia son inmutables y no tienen la palabra clave después de , lo que significa que no puedo cambiar lo que apuntan. Sin embargo, todavía puedo cambiar el valor al que hacen referencia. mut let *x_ref = 777; Si escribe esto, el compilador de Rust no se quejará y el valor de (no la referencia en sí) cambiará a . Sin embargo, hay un cuadrado rojo en el esquema que indica que carece de la opción de mutabilidad. Entonces, ¿por qué puedo cambiar el valor al que hace referencia? x 777 x_ref Volvamos al esquema de . let x_ref = &mut x El primer bloque blanco contiene el nombre: . El segundo me informa sobre el tipo almacenado en esa variable. En su forma completa, sin anotaciones de tipo implícitas, puedo escribir lo siguiente: x_ref let x_ref: &mut i32 = &mut x; Puedo interpretar esto como: creemos una llamada que contendrá una a y la inicializaremos inmediatamente con la al valor en la variable . variable inmutable x_ref referencia mutable i32 referencia mutable i32 x Esto significa que puedo modificar el valor al que apunta, pero no puedo alterar el valor (o dirección) de la referencia. En otras palabras, no puedo escribir algo como: let x_ref: &mut i32 = &mut x; let mut z = 0; x_ref = &mut z; // Not allowed! En términos de los esquemas, quiero cambiar la dirección a la que apunta la flecha en el bloque de código de arriba. Sin embargo, incluso si la variable es mutable, no puedo cambiar la flecha porque el problema radica en la inmutabilidad del propio . z x_ref Para cambiar la dirección de la flecha, necesito modificar la dirección almacenada en la variable . Sin embargo, no puedo hacer esto porque la variable es inmutable. x_ref ¡Vamos a hacerlo! 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! Hay demasiadas instancias de aquí alrededor de , ¿verdad? Describámoslos. mut x_ref : estoy creando una variable mutable llamada , lo que significa que puedo cambiar su valor más tarde. let mut x_ref x_ref : Estoy afirmando que la variable contendrá referencias mutables a algún valor de tipo . &mut i32 i32 : Estoy tomando prestada (obteniendo una referencia a) la variable . &mut x x Luego, creé una variable llamada y le asigné el valor . Luego, cuando escribí , indiqué que entiendo que es una variable mutable que solo puede contener referencias a valores . z 0 x_ref = &mut z x_ref i32 Dado que el tipo de es , puedo asignar su dirección a la variable . Para obtener la dirección de , utilicé la sintaxis . z i32 x_ref z &mut z El esquema. El truco mental Eche un vistazo a en la declaración, puede parecer un poco obvio, pero... = let mut x_ref = &mut x; … Lo veo como un divisor (especialmente si lo gira 90 grados) que divide la declaración en dos subdeclaraciones: izquierda y derecha. El lado izquierdo proporciona información en sí, mientras que el lado derecho nos informa . sobre la variable sobre el valor Cuando uso el operador de desreferencia para cambiar el valor... * *x_ref = 100; ... No cambio el valor de la variable . En cambio, estoy cambiando el valor al que hace referencia . x_ref x_ref Referencias inmutables Usé con frecuencia antes. ¿Qué pasa si omito algunos de ellos? mut let i = 1; let j = 2; let mut k = &i; ¿Puedo cambiar el valor de aquí? Usando la técnica del divisor, la respuesta es bastante sencilla. Puedo cambiar el valor de (veo en el lado izquierdo), pero el valor (lado derecho) es una referencia inmutable a (aquí no hay ). i k mut i mut Por lo tanto… let i = 1; let j = 2; let mut k = &i; k = &j; // This is legal. *k = 3; // This is not. El esquema. Conclusión En este artículo, analizamos los matices de la palabra clave y las referencias. Recuerde, existe una distinción entre una y una que contiene una referencia. ¿Nuestro truco? mut referencia mutable variable mutable Usar el signo como divisor mental para comprender mejor las tareas en Rust. Esta simple visualización puede aclarar muchas confusiones. = ¡Feliz codificación!