了解在锈中使用'*'的取消引用

时间:2018-09-25 08:54:40

标签: syntax reference rust move-semantics borrowing

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`

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

1 个答案:

答案 0 :(得分:1)

当您在Rust中写入let a = b;时,b的值被移动a,并且变量b不再可用

在您的情况下,xyz是对abc的引用,因此*xyzabc是同一件事。移动abc是一个错误,因为引用xyz仍然存在,但是现在指向无效的内存。

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

请参阅: