首页 > 解决方案 > 生锈教科书猜谜游戏的扩展显示出奇怪的行为

问题描述

所以我将猜谜游戏扩展为基本上询问用户是否想再玩一次。如果他们输入y,程序将返回到主游戏循环,如果他们输入n,它就会跳出当前循环并且程序结束。如果他们输入任何其他内容,理论上它应该只是跳到play_again循环的顶部并将yae_or_nay变量重新分配为玩家接下来输入的任何内容。但它并没有这样做,或者至少看起来它错误地覆盖了它。我是否错误地重新分配了变量?下面是代码(注意程序的前半部分与教科书中的几乎相同,但由于程序很短,我决定将整个内容包括在内):

extern crate rand;

use std::io;
use std::cmp::Ordering;
use rand::Rng; // random number generation library from rand 

fn main() {
println!("Guessing game!\n");

let mut answer = rand::thread_rng().gen_range(1,101); 
'gameloop: loop {
    println!("Please print your guess:");

    let mut yae_or_nay = String::new();
    let mut guess = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");

    let guess : u32 = match guess.trim().parse() {
        Ok(num) => num,
        Err(_) => {
            println!("Not a number!");
            continue;
        }
    };

    match guess.cmp(&answer) {
        Ordering::Less => println!("Higher!"),
        Ordering::Greater => println!("Lower!"),
        Ordering::Equal => {
            println!("Correct! Would you like to play again? (y/n)");
            'play_again: loop {
                io::stdin().read_line(&mut yae_or_nay)
                    .expect("Failed to read line.");

                match yae_or_nay.trim() { // match against a string
                    "y" => {
                        answer = rand::thread_rng().gen_range(1,101);
                        println!("Playing again...");
                        continue 'gameloop;
                    },
                    "n" => {
                        println!("Thanks for playing! Exiting now.");
                        break
                    },
                    _ => {
                        println!("what? You entered {}", &yae_or_nay);
                        continue 'play_again
                    }
                };
            }
        }
    }
}
}

这是控制台输出的片段:

46
Correct! Would you like to play again? (y/n)
i
what? You entered i

y
what? You entered i
y

n
what? You entered i
y
n

 . // period here for formatting sake, not actually in console

如您所见,我的程序重新分配的方式yae_or_nay似乎很奇怪。有谁知道发生了什么?提前感谢您的帮助。

标签: rust

解决方案


问题是您永远不会 clear yae_or_nay,并且io::stdin().read_line(&mut yae_or_nay)附加到字符串,而不是替换其内容。

读取所有字节,直到到达换行符(0xA 字节),并将它们附加到提供的缓冲区。

要么你应该做

yae_or_nay.clear();

在您阅读之前,或者可能更好的方法是将声明移至

'play_again: loop {
    let mut yae_or_nay = String::new();
    io::stdin().read_line(&mut yae_or_nay)
        .expect("Failed to read line.");

推荐阅读