当我不在循环中声明变量时,为什么我的代码在 Rust 中失败

sak*_*pta 1 rust

失败的代码

use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
    println!("Guess the Number!");
    let mut guess = String::new();
    let secret_number = rand::thread_rng().gen_range(1..10);
    loop {

        println!("Please input the guess.");
        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 Large!"),
            Ordering::Equal => println!("You got this"),
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

有效的代码

use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
    println!("Guess the Number!");
    let secret_number = rand::thread_rng().gen_range(1..10);
    loop {

        println!("Please input the guess.");
        //Now Defining guess Inside the loop  
        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 Large!"),
            Ordering::Equal => println!("You got this"),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,每次循环运行时定义猜测使我的代码正常工作,否则,我会收到如下所示的错误

为什么会发生这种情况,我只输入整数,这样我就不应该出现数据类型不匹配的情况,为什么一旦我开始定义猜测,它就会一次又一次地工作,我认为这与 rust 如何处理空格或输入中换行,但不确定。任何帮助将不胜 感激

Ram*_*chi 5

它失败了,因为每次您read_line都会将标准输入缓冲区附加到guess字符串中。所以guess会改变如下。

1\n-> 1\n2\n->1\n2\n3\n

为了解决这个问题,每个循环中的clear变量guess

use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
    println!("Guess the Number!");
    let mut guess = String::new();
    let secret_number = rand::thread_rng().gen_range(1..10);
    loop {

        println!("Please input the guess.");
        io::stdin().read_line(&mut guess).expect("Failed to read line"); 
        // I renamed it to a different name. Because I want to access the guess string in the end of the loop
        let guess_nmb: u32 = guess.trim().parse().expect("Please Type a Number");
        println!("You guessed: {}", guess_nmb); 
        match guess_nmb.cmp(&secret_number) {
            Ordering::Less => println!("Too Small!"),
            Ordering::Greater => println!("Too Large!"),
            Ordering::Equal => println!("You got this"),
        }
        // Clear the guess string
        guess.clear();
    }
}

Run Code Online (Sandbox Code Playgroud)