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`
请帮助我了解这里出了什么问题。
答案 0 :(得分:1)
当您在Rust中写入let a = b;
时,b
的值被移动到a
,并且变量b
不再可用
在您的情况下,xyz
是对abc
的引用,因此*xyz
与abc
是同一件事。移动abc
是一个错误,因为引用xyz
仍然存在,但是现在指向无效的内存。
如果您对为什么没有使用i32
这样的数字类型感到困惑,那是因为大多数简单的原语都实现了Copy
特性。这是标记特征,它告诉编译器将值复制到内存中,而不是移动它。对于小型类型,其性能可以与按引用传递相同(有时甚至更好)。
请参阅: