rust - 生锈教科书猜谜游戏的扩展显示出奇怪的行为
问题描述
所以我将猜谜游戏扩展为基本上询问用户是否想再玩一次。如果他们输入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
似乎很奇怪。有谁知道发生了什么?提前感谢您的帮助。
解决方案
问题是您永远不会 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.");
推荐阅读
- apache-spark - 如何将具有相同/共享分区的 HDFS 文件块应用于同一数据节点上的不同文件/表
- angular - IonicRouteStrategy 和 RouteReuseStrategy
- node.js - Heroku 部署和流量
- php - 如何使用 ejabberd 一次性向我名册中的所有朋友发送消息或向我名册中的每个人广播消息?
- bigdata - 无法在 Vespa 的 Document 中动态添加 Postion(纬度和经度)类型字段
- json - 使用 Vue JS 从 API 中获取数据时遇到问题
- r - 排列 R 闪亮的侧边栏对象
- xamarin.android - 安装 Microsoft.Azure.Mobile.Client NuGet 包后生成错误
- java - 监控方法统计
- javascript - 在第一次渲染时获取 cookie 返回 undefined with universal-cookie