What's the difference between placing "mut" before a variable name and after the ":"?
mutable, reference, rust, syntax, variables
Solution
`mut foo: T` means you have a variable called `foo` that is a `T`. You are allowed to change what the variable refers to:
let mut val1 = 2;
val1 = 3; // OK
let val2 = 2;
val2 = 3; // error: re-assignment of immutable variable
This also lets you modify fields of a struct that you own:
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` means you have a variable that refers to (`&`) a value and you are allowed to change (`mut`) the referred value (including fields, if it is a struct):
let val1 = &mut 2;
*val1 = 3; // OK
let val2 = &2;
*val2 = 3; // error: cannot assign to immutable borrowed content
Note that `&mut` only makes sense with a reference - `foo: mut T` is not valid syntax. You can also combine the two qualifiers (`let mut a: &mut T`), when it makes sense.
Problem
Here are two function signatures I saw in the Rust documentation: ``` fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo } fn modify_foo(foo: &mut i32) { *foo += 1; *foo } ``` Why the different placement of `mut`? It seems that the first function could also be declared as ``` fn modify_foo(foo: mut Box<i32>) { /* ... */ } ```