了解范围和阴影匹配

时间:2015-10-29 19:01:17

标签: rust

我试图改进最后的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

1 个答案:

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