Rust可变值与可变引用的区别

17

什么是两者之间的区别?

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

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

它们通过 println! 返回相同的结果,但我无法决定哪一个更好。

1个回答

34

鉴于您提供了一个将变量绑定到其中一个并在本地调用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个添加到副本..并且根本不引用原始内存块。

这完全取决于使用情况。如果您需要在函数边界交叉引用原始内存,则需要使用可变引用。如果您只是在函数内部本地改变变量,则不需要引用。如果您已将变量标记为可变,则很有可能需要引用原始内存以更新它。

1
你可以从第一个示例中删除let mut,它仍然可以工作,所以我不认为这真正回答了OP的问题。 - what the

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接