Rust 告诉 '' 值移到这里,在循环的前一次迭代中”

标签 rust

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

#[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()?一次调用即可完美编译和运行。

使用结构而不是枚举会更好吗?

最佳答案

好的,将函数的签名更改为

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

现在需要修复一些其他线路。

现在可以,但我不知道为什么。

关于Rust 告诉 '' 值移到这里,在循环的前一次迭代中”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58740016/

相关文章:

rust - 为什么 Rust 删除了绿色线程模型;缺点是什么?

loops - 发生错误时循环的正确方法是什么

string - 如何将带有多个参数的单个字符串传递给 std::process::Command?

rust - Rust的确切自动引用规则是什么?

data-structures - 如何在特征的函数中发送不同的结构?

string - 如何在Rust中填充左手? [复制]

rust - 在通用结构中派生 Show

rust - 交换两个本地引用会导致生命周期错误

rust - 如何在不移动自身的情况下消除混合 Iterator 和 Futures 调用链的歧义?

rust - 在Rust中基于用户输入运行功能