我正在努力改进最终的猜谜游戏示例代码。特别是,如果用户没有输入数字,我计划再次输出"请输入数字!",而不是"请输入您的猜测。"。我用一个内环来做这个。下面的代码确实有效:
let guess: u32;
loop {
let mut guess_str = String::new();
io::stdin().read_line(&mut guess_str)
.ok()
.expect("Failed to read line");
guess = match guess_str.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("Please input a number!");
continue;
}
};
break;
}
如果可以的话,我想通过适当地遮蔽比赛来避免guess_str
。如果我将guess_str
更改为guess
,Rust会抱怨use of possibly uninitialized variable: `guess`
。如果用上面的代码不可能不初始化变量,我不确定它怎么可能被取消初始化。有没有什么方法可以只使用guess
来做到这一点?
让我们来看一个更简单的复制:
fn make_guess() -> u32 {
let guess;
{
let mut guess;
guess = 1;
}
guess
}
在这里,您创建一个外部变量guess
,然后在块内部对其进行阴影处理。将值1
分配给guess
时,即分配给内部变量。外部变量从未设置为任何值,因此您最终会出现"使用可能未初始化的变量"错误。
有没有办法只使用一个变量
间接地,是的。我会把代码提取到一个函数中。当你有一个成功的猜测,你可以简单地return
。否则,允许循环发生:
fn make_guess() -> u32 {
loop {
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.ok()
.expect("Failed to read line");
match guess.trim().parse() {
Ok(num) => return num,
Err(_) => {
println!("Please input a number!");
}
}
}
}
这完全避免了阴影,避免了必须使用显式continue
,并为代码添加了少量抽象和组织。