我试图将C中的旧编译器教科书中的翻译器/解析器示例移植到Rust中。在标准偏差处使用匹配偷看
我有以下代码:
use std::io::Read;
fn lexan() {
let mut input = std::io::stdin().bytes().peekable();
loop {
match input.peek() {
Some(&ch) => {
match ch {
_ => println!("{:?}", input.next()),
}
}
None => break,
}
}
}
在这一点上我没有积极尝试解析输入,只是让我围绕如何match
工作头。目标是将解析分支添加到内部匹配中。可惜这不能编译,因为我似乎理解比赛的语义失败:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:7:18
|
7 | Some(&ch) => {
| ^--
| ||
| |hint: to prevent move, use `ref ch` or `ref mut ch`
| cannot move out of borrowed content
据我了解,这个错误是因为我没有自己的match
的返回值。事情是,我不相信我正在使用任一比赛的返回值。我想也许input.next()
可能是问题所在,但是在使用或不使用此部分(或实际上,整个println!调用)时会发生相同的错误。
我在这里错过了什么?自从我看了Rust以来,一直有一段时间(并且从未付出过很大的努力),而且这种性质的大多数搜索结果似乎都过时了。
您是否尝试过编译器提示的内容?有什么不足呢? – Shepmaster
我没有,因为我不指望'ch'在这里应该被认为是可变的。然而,这种改变似乎将代码中的问题进一步转移。 – user3662805
如果我是你,我会读取所有输入到内存中,然后遍历* * :) –