variables名前面和后面的`mut`有什么区别?
这里是我在Rust文档中看到的两个函数签名:
fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo } fn modify_foo(foo: &mut i32) { *foo += 1; *foo }
为什么mut
的不同位置?
看来第一个函数也可以声明为
fn modify_foo(foo: mut Box<i32>) { /* ... */ }
mut foo: T
意思是你有一个叫做foo
的variables,它是一个T
您可以更改variables引用的内容 :
let mut val1 = 2; val1 = 3; // OK let val2 = 2; val2 = 3; // error: re-assignment of immutable variable
这也可以让你修改你自己的结构体的字段:
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
意味着你有一个variables引用( &
)一个值,你可以改变( mut
) 引用的值 (包括字段,如果它是一个结构体):
let val1 = &mut 2; *val1 = 3; // OK let val2 = &2; *val2 = 3; // error: cannot assign to immutable borrowed content
请注意, &mut
仅在引用时才有意义 – foo: mut T
不是有效的语法。 你也可以合并两个限定符( let mut a: &mut T
),当它有意义的时候。
如果你来自C / C ++,基本上可以这样想:
// 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
你会注意到这些是互逆的。 C / C ++采取“黑名单”的方法,如果你想要某些东西是不变的,你必须明确地说,而Rust采取“白名单”的方法,如果你想要某些东西是可变的,你必须明确地说。