Rust可变值vs可变引用

时间:2016-12-01 22:40:12

标签: reference rust mutable

之间有什么区别
let y = &mut 5;
*y += 1;
let x = *y + 1;

let mut y = 5;
y += 1;
let x = y + 1;

他们通过println!返回相同的结果,但我无法确定哪一个更合适。

1 个答案:

答案 0 :(得分:10)

考虑到将变量绑定到一个或另一个的简单示例,然后在本地调用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的值会更新。

在此特定示例中,xu32,它实现了Copy特征。将x传递到do_work方法后,会生成x的副本。在do_work方法的正文中,n += 5将5 添加到副本 ..并且根本不会引用原始内存块。

  

...无法决定哪一个更受欢迎。

这完全取决于用例。跨越函数边界时是否需要引用原始内存?如果您已将变量标记为可变,则很可能您希望引用原始内存以期更新它。在这种情况下,您将使用可变引用。如果你只是在一个函数中本地改变一个变量..那么你就不需要引用了。