【发布时间】:2020-10-14 17:13:55
【问题描述】:
我发现这段代码可以编译:
let mut s1 = String::from("hello");
let _s2 = s1;
s1 = String::from("world");
println!("{}", s1);
如果没有第三行,我会收到一个错误,抱怨不能借用移动的变量,这对我来说是可以理解的:
error[E0382]: borrow of moved value: `s1`
--> src/main.rs:5:16
|
2 | let mut s1 = String::from("hello");
| ------ move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait
3 | let _s2 = s1;
| -- value moved here
4 | //s1 = String::from("world");
5 | println!("{}", s1);
| ^^ value borrowed here after move
第三行代码编译。
这是我的理解:s1 被移动后,s1 仍然处于某种有效状态,只是编译器阻止您访问它;如果您重新分配它,它会获得新的所有权,并且编译器会理解它并进行编译。
我说的对吗?我在哪里可以找到任何正式解释这一点的文档/规范?
【问题讨论】:
-
"移动 s1 后,s1 仍处于某种有效状态"。这表明对 Rust 的一个小误解。将用于保存的值 s1 从变量 s1 中移出后,该变量变为空。将 s1(变量)想象成一个盒子,将值想象成可以分配给这些盒子并在这些盒子之间移动的球。
标签: rust move-semantics