loop 关键字创建了一个无限循环。我们会增加循环来给用户更多机会猜数字:
# use std::cmp::Ordering;
# use std::io;
#
# fn main() {
# println!("Guess the number!");
#
# let secret_number = rand::thread_rng().gen_range(1..101);
#
// --snip--
println!("The secret number is: {}", secret_number);
loop {
println!("Please input your guess.");
// --snip--
#
# let mut guess = String::new();
#
# io::stdin()
# .read_line(&mut guess)
# .expect("Failed to read line");
#
# let guess: u32 = guess.trim().parse().expect("Please type a number!");
#
# println!("You guessed: {}", guess);
#
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
}
如上所示,我们将提示用户猜测之后的所有内容移动到了循环中。确保 loop 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出啊! 用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环,就是 ” 比较猜测与秘密数字” 部分提到的 parse:如果用户输入的答案不是一个数字,程序会崩溃。我们可以利用这一点来退出,如下所示:
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 1.50s
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 59
Please input your guess.
45
You guessed: 45
Too small!
Please input your guess.
60
You guessed: 60
Too big!
Please input your guess.
59
You guessed: 59
You win!
Please input your guess.
quit
thread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit }', src/main.rs:28:47
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
输入 quit 将会退出程序,同时你会注意到其他任何非数字输入也一样。然而,这并不理想,我们想要当猜测正确的数字时游戏停止。