微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解决[E0382]:在for循环中使用移动的值?

如何解决如何解决[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 举报,一经查实,本站将立刻删除。