我正在实现一个解析器组合器库:
#[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/