如何解决如何解决[E0382]:在for循环中使用移动的值?
error[E0382]: use of moved value: `nd3`
--> src/main.rs:21:21
|
19 | Node::Y { nd: nd3,max: max } => {
| --- move occurs because `nd3` has type `std::Boxed::Box<Node>`,which does not implement the `copy` trait
20 | for m in 0..max - 1 {
21 | match recur(nd3) {
| ^^^ value moved here,in prevIoUs iteration of loop
代码如下。请不要介意代码似乎毫无意义,因为我已对其进行了简化:
enum Node {
X { x: usize },Y { nd: Box<Node>,max: usize },Z { Nd: Vec<Box<Node>> },}
fn recur(nd: Box<Node>) -> Result<usize,()> {
match *nd {
/// ...
Node::Y { nd: nd3,max: max } => {
for m in 0..max - 1 {
match recur(nd3) {
Ok(y) => return Ok(y),_ => {}
}
}
return Ok(123);
}
_ => {}
}
return Ok(0);
}
解决方法
如果您拥有一个拥有的值(nd
),并对其进行迭代,然后再次对其进行迭代,则会收到错误消息,因为它已移入循环的上一个迭代中。 / p>
一种解决方案是派生Clone
的{{1}}特征。 Node
是显式复制对象的一个共同特征:
Clone
现在,当您递归再次调用该函数时,您可以克隆#[derive(Clone)]
enum Node {
X { x: usize },Y { nd: Box<Node>,max: usize },Z { Nd: Vec<Box<Node>> },}
:
nd3
现在,您没有将拥有的值传递给循环的下一个迭代。相反,您传递的是完全相同的副本。另一个解决方案是借用该值。但是,对于较小的对象,克隆更容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。