以下两行代码:
为什么会发生这种情况,如何使用
let x = Box::new(("slefj".to_string(), "a".to_string()));
let (a, b) = *x;
产生错误:
error[E0382]: use of moved value: `x`
--> src/main.rs:3:13
|
3 | let (a, b) = *x;
| - ^ value used here after move
| |
| value moved here
|
= note: move occurs because `x.0` has type `std::string::String`, which does not implement the `Copy` trait
有趣的是,如果我对一个包含多个部分的枚举类型进行此操作,我会得到稍微不同的错误:
enum Tree {
Nil,
Pair(Box<Tree>, Box<Tree>),
}
fn main() {
let x = Box::new(Tree::Nil);
match *x {
Tree::Pair(a, b) => Tree::Pair(a, b),
_ => Tree::Nil,
};
}
我遇到了错误:
error[E0382]: use of collaterally moved value: `(x:Tree::Pair).1`
--> src/main.rs:10:23
|
10 | Tree::Pair(a, b) => Tree::Pair(a, b),
| - ^ value used here after move
| |
| value moved here
|
= note: move occurs because `(x:Tree::Pair).0` has type `std::boxed::Box<Tree>`, which does not implement the `Copy` trait
为什么会发生这种情况,如何使用
let
/match
轻松地解构结构并获取内部部分的所有权?我知道可以先取消引用并为结构命名,但如果我深入模式匹配到一个结构中,那将变得非常冗长。
let Box((a,b)) = x;
,我已将其报告为 #22207。 - Shepmasterbox
语法实现,但目前该功能已被特性门控(并且可能会更改)。不确定是否可以使用Box
(结构体)进行解构赋值。 - Renato Zannon