两者的区别是什么

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的值将被更新.

在这个特定的例子中,xu32,它实现了Copy特征.将x传递到do_work方法中时,将生成x的副本.在do_work方法的主体中,n += 5加上5 to the copy..并且根本不引用原始内存块.

...无法决定哪一个更可取.

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

Rust相关问答推荐

为什么在Rust struct 中只允许最后一个字段具有动态大小的类型

重新导出proc宏导致未解决的extern crate错误""

为什么单元类型(空元组)实现了`Extend`trait?

交叉术语未正确清除屏幕

如何装箱生命周期相关联的两个对象?

限制未使用的泛型导致编译错误

integer cast as pointer是什么意思

如何用Axum/Tower压缩Html内容?

如何在递归数据 struct 中移动所有权时变异引用?

是否提供Bundle 在可执行文件中的warp中的静态文件?

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

Rust 文件未编译到 dll 中

为什么 `tokio::join!` 宏不需要 Rust 中的 `await` 关键字?

在 Rust 中,Weak 如何知道内部值何时被删除?

在 Rust 中,将可变引用传递给函数的机制是什么?

Rust 中函数的类型同义词

在 Rust 中有条件地导入?

如何在 Rust 中构建一个 str