Rust 为什么我需要在循环的每次迭代中声明一个变量来使用它?

Rust 为什么我需要在循环的每次迭代中声明一个变量来使用它?,rust,Rust,我正在学习生锈,我刚刚完成了第一个练习 我用cargo来建造和运行我的小板条箱 $cargo--版本 货运1.37.0(9edd08916 2019-08-02) $C--版本 rustc 1.37.0(eae3437df 2019-08-13) 一切运行正常,包括发布模式。然而,我不理解Rust的以下行为:我必须在循环的每次迭代中重新声明包含用户输入的变量 因为这个练习是一步一步指导的,所以我的代码与书中的代码相同。尽管如此,本书中的代码如下: loop { // Some code

我正在学习生锈,我刚刚完成了第一个练习

我用
cargo
来建造和运行我的小板条箱

$cargo--版本
货运1.37.0(9edd08916 2019-08-02)
$C--版本
rustc 1.37.0(eae3437df 2019-08-13)
一切运行正常,包括
发布
模式。然而,我不理解Rust的以下行为:我必须在循环的每次迭代中重新声明包含用户输入的变量

因为这个练习是一步一步指导的,所以我的代码与书中的代码相同。尽管如此,本书中的代码如下:

loop {
    // Some code to display instructions.

    // Reallocate a new string at each iteration!
    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(_) => continue,
    };

    // Some code to check if the player found the secret number.
}
注意到这种系统性的重新分配,我将字符串声明移到了循环之外:

//分配字符串一次。
让mut guess=String::new();
环路{
//一些代码显示指令。
io::stdin().read_行(&mut guess)
.expect(“读取行失败”);
让我们猜猜:u32=匹配guess.trim().parse(){
Ok(num)=>num,
Err()=>继续,
};
//一些代码来检查玩家是否找到了秘密号码。
}
然而,Rust并不欣赏这一点:在循环的第二次迭代中,它每次都会惊慌失措

为什么我不能多次重用同一个可变变量?我不明白吗

编辑:
read\u行
不清除上一个输入的内容,但附加以下内容。 假设玩家输入
1
然后
2
,猜测的最终值将是
“1\n2\n”

但是,
trim()
删除字符串开头和结尾的“空白”字符,在中间留下一个
\n
parse()
panics

您的代码在我的安装程序(与rust版本相同)上编译并运行良好。恐慌必须发生在代码被注释掉的部分。不过也有一些评论:循环中的作用域很复杂:
guess
在循环的上半部分是在循环外声明的字符串,在下半部分是解析后的整数

更重要的是,多个对
read\u line
的调用被传递到同一个字符串后会附加到该字符串,考虑到您解析该字符串的方式,这可能不是您的意图。喷洒在
println,应该是有启发性的。如果在解析数字后在字符串上添加一个
guess.clear()
,则代码可能会被修复,但要做到这一点,您可能需要重命名u32
guess


作为一个旁白,您可以考虑使用Buffader和在Reader。LIX()中的< <代码>模式

您是完全正确的,<代码> ReadyLoe< /Cord>追加对前一个字符串的输入;调试器向我显示,在第二轮中,比如说,
1
然后
2
-
guess
包含
“1\n2\n”
guess.clear()
就在输入解决问题之前!非常感谢。我编辑了我的答案,在每一行读之前加入了修正:call guess.clear()。