Rust сообщает '' значение, перемещенное сюда, в предыдущей итерации цикла " - PullRequest
0 голосов
/ 07 ноября 2019

Я реализую библиотеку комбинатора синтаксического анализатора:

#[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() в цикле или даже дважды? Один вызов компилируется и выполняется отлично.

Было бы лучше использовать структуру вместо перечисления?

1 Ответ

0 голосов
/ 07 ноября 2019

ОК, изменила подпись функции на

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

и теперь нуждалась в исправлении некоторых других строк.

Работает сейчас, но я не знаю почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...