I want to compare a string input from stdin to a static string with no luck.
Here is what I have tried so far:
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);
}
}
However during assertion it failed. How should I compare a string input to a static string in Rust?
Your help is very much appreciated.
First of all, the line contains the line terminator. You probably want to use
trim
(or one of its variants) to ignore that.Secondly, you're doing a lot of unnecessary conversions and allocations. Try to avoid those.
Third,
to_string
is (or at least, was the last time I checked) inefficient due to over-allocation. You wantinto_string
.Fourth, the quickest way to go from a
String
to a&str
is to "cross-borrow" it; given aString
s
,&*s
will re-borrow it as a&str
. This is because aString
implementsDeref<&str>
; in other words,String
acts kind of like a smart pointer to a borrowed string, allowing it to decay into a simpler form.Fifth, unless you're doing something unusual, you can rewrite this as a
for
loop using thelines
iterator method.Sixth, be aware that
stdin()
actually allocates a new buffered reader every time you call it. Not only that, but characters read into the buffer do not get "pushed back" into STDIN when a new buffer is created; that data is simply lost. So you really don't want to be calling it in a loop. If you need to, call it once and keep the result in a variable.So, I end up with this: