下面是我的锈文档中看到了两个函数签名:
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>) { /* ... */ }
下面是我的锈文档中看到了两个函数签名:
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
这是一个T
。 你被允许改变变量指的是什么:
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
意味着你有指代(a可变&
)的值,并且你被允许改变( 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 ++采取了“黑名单”的做法,在这里,如果你想要的东西是不可改变的,你必须明确这样说,而锈采用“白名单”的方法,在这里,如果你想要的东西是可变的,你必须明确这样说。