什么是两者之间的区别?
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;
}
我想知道你认为它会打印什么?这里是在游乐场上的代码
现在看看这段代码:
fn main() {
let mut x = 5;
do_work(x);
println!("{}", x);
}
fn do_work(mut n: u32) {
n += 5;
}
你认为这会打印什么? 在playground上看看
答案是:
顶部代码块打印10
。底部代码块打印5
。
使用可变引用意味着您引用了存储变量x
的内存位置。跨函数边界,您可以更改存储在那里的内存中的值。当方法返回并且println!
命中时...更新x
的值。
在此特定示例中,x
是一个实现Copy
特性的u32
。当您将x
传递到do_work
方法中时,会创建x
的副本。在do_work
方法的主体中,n += 5
将5个添加到副本..并且根本不引用原始内存块。
let mut
,它仍然可以工作,所以我不认为这真正回答了OP的问题。 - what the