variables - ps4 - rust traduccion
¿Cuál es la diferencia entre colocar "mut" antes de un nombre de variable y después de ":"? (2)
Si viene de C / C ++, también podría ser útil pensar en esto básicamente así:
// Rust C/C++
a: &T == const T* const a; // can''t mutate either
mut a: &T == const T* a; // can''t mutate what is pointed to
a: &mut T == T* const a; // can''t mutate pointer
mut a: &mut T == T* a; // can mutate both
Notarás que estos son inversos entre sí. C / C ++ adopta un enfoque de "lista negra", donde si quiere que algo sea inmutable, debe decirlo explícitamente, mientras que Rust adopta un enfoque de "lista blanca", donde si desea que algo sea mutable, debe decirlo explícitamente.
Aquí hay dos firmas de funciones que vi en la documentación de Rust:
fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo }
fn modify_foo(foo: &mut i32) { *foo += 1; *foo }
¿Por qué la colocación diferente de
mut
?
Parece que la primera función también podría declararse como
fn modify_foo(foo: mut Box<i32>) { /* ... */ }
mut foo: T
significa que tienes una variable llamada
foo
que es una
T
Se le permite cambiar a qué se
refiere
la variable:
let mut val1 = 2;
val1 = 3; // OK
let val2 = 2;
val2 = 3; // error: re-assignment of immutable variable
Esto también le permite modificar los campos de una estructura de su propiedad:
struct Monster { health: u8 }
let mut orc = Monster { health: 93 };
orc.health -= 54;
let goblin = Monster { health: 28 };
goblin.health += 10; // error: cannot assign to immutable field
foo: &mut T
significa que tiene una variable que se refiere a (
&
) un valor y se le permite cambiar (
mut
) el
valor referido
(incluidos los campos, si es una estructura):
let val1 = &mut 2;
*val1 = 3; // OK
let val2 = &2;
*val2 = 3; // error: cannot assign to immutable borrowed content
Tenga en cuenta que
&mut
solo tiene sentido con una referencia -
foo: mut T
no es una sintaxis válida.
También puede combinar los dos calificadores (
let mut a: &mut T
), cuando tenga sentido.