Syntax 使用'理解去参考*';锈迹斑斑

Syntax 使用'理解去参考*';锈迹斑斑,syntax,reference,rust,move-semantics,borrowing,Syntax,Reference,Rust,Move Semantics,Borrowing,编译代码时会出现以下错误: 错误[E0507]:无法移出借用的内容 -->src/main.rs:11:13 | 11 |设q=*xyz; | ^^^^ | | |无法移出借用的内容 帮助:考虑使用引用代替:‘*XYZ’ 请帮助我理解这里出了什么问题。当您编写时,让a=b在Rust中,b的值移动到a,变量b不再可用 在您的例子中,xyz是对abc的引用,因此*xyz与abc是一样的。移动abc是一个错误,因为引用xyz仍然存在,但现在指向无效内存

编译代码时会出现以下错误:

错误[E0507]:无法移出借用的内容
-->src/main.rs:11:13
|
11 |设q=*xyz;
|             ^^^^
|             |
|无法移出借用的内容
帮助:考虑使用引用代替:‘*XYZ’

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

当您编写
时,让a=b
在Rust中,
b
的值移动到
a
,变量
b
不再可用

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

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

见:


可能的重复您能否进一步描述在这个特定示例中让您困惑的是什么?这本关于所有权的书可能会帮助你了解正在发生的事情。此外,还有。下面的代码是编译的,但问题代码“fn main(){let mut abc=10;let xyz=&abc;let q=*xyz;}”@user8070445数字是
Copy
类型,所以它们不会被移动。您的结构在分配给变量时将被移动,因为它不是
Copy
struct Abc {
    a: i32,
}

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