【问题标题】:Rust tells ''value moved here, in previous iteration of loop"Rust 告诉“在循环的前一次迭代中,值移到了这里”
【发布时间】:2020-03-03 12:28:09
【问题描述】:

我正在实现一个解析器组合库:

#[derive(Debug)]
enum Parser {
    Char(char),
    Positive(Box<Parser>),
}

impl Parser {
    fn run(self, s: &str) -> (bool, &str) {
        match self {
            Parser::Char(ch) => {
                if s[0..1].chars().next().unwrap() == ch {
                    (true, &s[1..])
                } else {
                    (false, s)
                }
            }

            Parser::Positive(parser) => {
                //println!("{:?}", parser);
                let mut s = s;
                let mut res = (false, s);
                let parser = *parser;

                loop {
                    let ret = parser.run(s);
                    if !ret.0 {
                        break;
                    }

                    res = ret;
                    s = res.1
                }

                res
            }
            _ => (false, s),
        }
    }
}

pub fn run() {
    let x = Parser::Positive(Box::new(Parser::Char('a')));
    let ret = x.run("aaa");

    println!("{} {}", ret.0, ret.1);
}

我收到了错误

error[E0382]: use of moved value: `parser`
  --> src/lib.rs:25:31
   |
22 |                 let parser = *parser;
   |                     ------ move occurs because `parser` has type `Parser`, which does not implement the `Copy` trait
...
25 |                     let ret = parser.run(s);
   |                               ^^^^^^ value moved here, in previous iteration of loop

我不知道为什么会这样。我尝试将 Copy 特征添加到 Parser 枚举,但这会导致其他错误。为什么我不能循环调用parser.run(),甚至不能调用两次?一次调用即可完美编译并运行。

使用结构体代替枚举会更好吗?

【问题讨论】:

标签: rust


【解决方案1】:

好的,把函数的签名改成

fn run<'a>(&self, s: &'a str) -> (bool, &'a str)

现在需要修复一些其他行。

现在有效,但我不知道为什么。

【讨论】:

  • 你可能想阅读 Rust 的书,尤其是第 5.2 和 5.3 章关于何时使用self/&amp;self/&amp;mut self
  • 你是否尝试过借用一个可变的 self 引用? &amp;mut self。在函数定义中声明 this 将保证您的函数不会拥有自己。在我的一个模组中遇到了这个问题。我声明了一个结构,然后在每个循环中调用了一个函数,并得到了同样的错误。
猜你喜欢
  • 2023-04-10
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2017-02-12
  • 2020-07-12
相关资源
最近更新 更多