What's the difference between placing “mut” before a variable name and after the “:”?

前端 未结 2 1847
孤独总比滥情好
孤独总比滥情好 2020-11-22 09:36

Here are two function signatures I saw in the Rust documentation:

fn modify_foo(mut foo: Box) { *foo += 1; *foo }
fn modify_foo(foo: &mut i32)         


        
相关标签:
2条回答
  • 2020-11-22 10:01

    If you're coming from C/C++, it might also be helpful to think of it basically like this:

    // 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
    

    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.

    0 讨论(0)
  • 2020-11-22 10:02

    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.

    0 讨论(0)
提交回复
热议问题