了解在 Rust 中使用“*”取消引用

Understanding de-referencing using '*' in rust

struct Abc {
    a: i32,
}

fn main() {
    let mut abc = Abc { a: 30 };
    let xyz = &abc;
    let q = *xyz;
}

编译代码出现以下错误:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:11:13
   |
11 |     let q = *xyz;
   |             ^^^^
   |             |
   |             cannot move out of borrowed content
   |             help: consider using a reference instead: `&*xyz`

请帮助我了解这里出了什么问题。

当你在Rust中写let a = b;时,b的值被移动a,变量b ] 不再可用。

在您的例子中,xyz 是对 abc 的引用,因此 *xyzabc 是一回事。移动 abc 是一个错误,因为引用 xyz 仍然存在,但现在指向无效内存。

如果您对为什么像 i32 这样的数字类型没有发生这种情况感到困惑,那是因为大多数简单的原语都实现了 Copy 特性。这是标记特征,它告诉编译器复制内存中的值,而不是移动它。对于小型类型,这与通过引用传递的性能相同(有时甚至更好)。

参见: