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>) { /* ... */ }
mut foo: T
means you have a variable calledfoo
that is aT
. You are allowed to change what the variable refers to:This also lets you modify fields of a struct that you own:
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):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.If you're coming from C/C++, it might also be helpful to think of it basically like this:
You'll notice that these are inverses of each other. C/C++ take a "blacklist" approach, where if you want something to be immutable you have to say so explicitly, while Rust takes a "whitelist" approach, where if you want something to be mutable you have to say so explicitly.