【发布时间】:2019-09-11 23:25:44
【问题描述】:
我正在从The Book 学习 Rust,我刚刚完成了第一个练习,guessing game。
我使用cargo 来构建和运行我的小箱子。
$ cargo --version
cargo 1.37.0 (9edd08916 2019-08-02)
$ rustc --version
rustc 1.37.0 (eae3437df 2019-08-13)
一切运行良好,包括release 模式。不过,我不理解 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.
}
注意到这种系统性的重新分配,我将字符串声明移到了循环之外:
// Allocate the string once.
let mut guess = String::new();
loop {
// Some code to display instructions.
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.
}
然而,Rust 不明白这一点:在循环的第二次迭代中,它每次都会恐慌。
为什么我不能多次重复使用同一个可变变量?我有什么不明白的吗?
编辑:read_line 确实不清除前一个输入的内容,而是将下一个输入附加到它上面。
假设玩家输入1,然后输入2,猜测的最终值将是"1\n2\n"。
但是,trim() 删除了字符串开头和结尾的“空白”字符,在中间留下了 \n:parse() 恐慌!
【问题讨论】:
标签: rust