Ich versuche, ein Übersetzer/Parser-Beispiel aus einem alten Compiler-Lehrbuch von C nach Rust zu portieren.Spähen bei stdin mit Übereinstimmung
Ich habe den folgenden Code:
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,
}
}
}
An diesem Punkt bin ich nicht aktiv um die Eingabe zu analysieren versucht, meinen Kopf zu umgehen, wie match
funktioniert. Ziel ist es, Parse-Zweige zum inneren Match hinzuzufügen. Leider versagt diese zu kompilieren, weil ich das Verständnis der Semantik von Spiel zu scheitern scheinen:
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
Von dem, was ich verstehe, dieser Fehler ist, weil ich den Rückgabewert des match
nicht besitzen. Die Sache ist, ich glaube nicht, dass ich den Rückgabewert beider Spiele verwende. Ich dachte vielleicht input.next()
könnte das Problem gewesen sein, aber der gleiche Fehler tritt mit oder ohne diesen Teil (oder in der Tat, die gesamte println! Anruf).
Was fehlt mir hier? Es ist schon eine Weile her, dass ich Rust angeschaut habe (und nie in einem ernsthaften Maß an Anstrengung), und die meisten Suchergebnisse für Dinge dieser Art scheinen veraltet zu sein.
Haben Sie versucht, was der Compiler vorgeschlagen? Was war daran nicht ausreichend? – Shepmaster
Ich habe nicht, da ich nicht erwarte 'ch' sollte hier als veränderlich betrachtet werden. Durch die Änderung scheint sich das Problem jedoch im Code weiter zu verschieben. – user3662805
Wenn ich Sie wäre, würde ich alle Eingaben in den Speicher lesen und dann über * das * iterieren. –