两者的区别是什么
let y = &mut 5;
*y += 1;
let x = *y + 1;
和
let mut y = 5;
y += 1;
let x = y + 1;
他们通过println!
返回相同的结果,但我无法决定哪一个更好.
两者的区别是什么
let y = &mut 5;
*y += 1;
let x = *y + 1;
和
let mut y = 5;
y += 1;
let x = y + 1;
他们通过println!
返回相同的结果,但我无法决定哪一个更好.
举一个简单的例子,将一个变量绑定到一个或另一个,然后在本地调用println!
,结果并没有太大差别(正如您所指出的).
当您跨越函数边界时,可变值与可变引用之间的关系变得更加清晰.看看下面的代码:
fn main() {
let mut x = &mut 5;
do_work(x);
println!("{}", x);
}
fn do_work(n: &mut u32) {
*n += 5;
}
你觉得它印的是什么?Here it is on the playground
现在看看这个代码:
fn main() {
let mut x = 5;
do_work(x);
println!("{}", x);
}
fn do_work(mut n: u32) {
n += 5;
}
你觉得这印的是什么?Here it is on the playground
答案是:
最上面的代码块打印10
.底部的代码块打印5
.
使用可变引用意味着您正在引用内存中存储变量x
的位置.跨越函数边界,您可以更改存储在内存中的值.当方法返回并点击println!
次时..x
的值将被更新.
在这个特定的例子中,x
是u32
,它实现了Copy
特征.将x
传递到do_work
方法中时,将生成x
的副本.在do_work
方法的主体中,n += 5
加上5 to the copy..并且根本不引用原始内存块.
...无法决定哪一个更可取.
这完全取决于用例.当跨越函数边界时,是否需要引用原始内存?如果您已将变量标记为可变的,则很可能希望引用原始内存以更新它.在这种情况下,可以使用可变引用.如果你只是在函数中局部变异一个变量..那么你就不需要推荐人了.