Vergleich von string in Rust
Möchte ich eine Zeichenfolge vergleichen, die Eingabe von stdin, um einen statischen string mit kein Glück.
Hier ist, was ich bisher versucht habe:
fn main() -> () {
let mut line = "".to_string();
let exit = "exit".to_string();
while line.as_slice() != exit.as_slice() {
let input = std::io::stdin().read_line().ok();
line.push_str( input.unwrap().to_string().as_slice() );
assert_eq!(line, exit);
}
}
Jedoch während der assertion fehlgeschlagen ist. Wie soll ich das vergleichen ein string-input, um eine statische Zeichenfolge in Rust?
Ihre Hilfe wird sehr geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, die Zeile enthält terminator. Sie wollen wahrscheinlich verwenden
trim
(oder einer seiner Varianten) zu ignorieren.Zweitens, Sie tun eine Menge von unnötigen Konvertierungen und Zuweisungen. Versuchen Sie zu vermeiden.
Dritten
to_string
ist (oder zumindest war das Letzte mal habe ich geprüft) ineffizient wegen der überallokation. Sie möchteninto_string
.Vierten, der Schnellste Weg, um zu gehen von einem
String
zu einem&str
ist die "cross-leihen"; es erhält eineString
s
,&*s
wieder aufzunehmen, als&str
. Dies ist, weil eineString
implementiertDeref<&str>
; in anderen Worten,String
wirkt Art von wie ein smart pointer auf ein geliehenes Zeichenfolge, so dass es zu zerfallen in eine einfachere form.Fünfte, es sei denn, Sie tun etwas ungewöhnlich ist, können Sie diese umschreiben als
for
Schleife über dielines
iterator-Methode.Sechsten, bewusst sein, dass
stdin()
tatsächlich weist eine neue buffered reader jedes mal, wenn Sie nennen es. Nicht nur das, sondern Zeichen in den Puffer eingelesen nicht bekommen "zurückgeschoben" in STDIN, wenn ein neuer Puffer erstellt; diese Daten einfach verloren. Damit Sie wirklich nicht wollen, dass sein Aufruf in einer Schleife. Wenn Sie brauchen, rufen Sie es einmal, und halten Sie das Ergebnis in eine variable.So, dass ich am Ende mit diesem: