了解范围和阴影匹配

  • 本文关键字:阴影 范围 了解 rust
  • 更新时间 :
  • 英文 :


我正在努力改进最终的猜谜游戏示例代码。特别是,如果用户没有输入数字,我计划再次输出"请输入数字!",而不是"请输入您的猜测。"。我用一个内环来做这个。下面的代码确实有效:

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,并为代码添加了少量抽象和组织。

最新更新