我试图改进最后的guessing game sample code。特别是,我计划输出"请输入一个数字!"如果用户没有输入数字而不是"请输入您的猜测。"再次。我用内循环来做这件事。下面的代码确实有效:
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
?
答案 0 :(得分:3)
让我们看一下简单的再现:
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
,并在代码中添加了少量抽象和组织。