Rust 如何处理隐藏变量?

gwa*_*ang 6 rust

我有很强的 C/C++ 背景,最近正在学习 Rust。对 Rust 如何处理隐藏变量感到困惑。特别是,我期望以下代码段运行不会有问题,因为guess在下一次在read_line.

阅读 API 文档,我知道read_line会将下一个输入附加到guess. 但是在阴影之后,应该guess被认为是一个整数,这样的附加是无效的吗?请帮忙。

fn main() {
    let secret_number = 10;
    let mut guess = String::new();

    loop {
        //guess.clear(); // uncomment this line will make it work. 
        println!("Please input your guess:");
        io::stdin()
            .read_line(&mut guess)
            .expect("Failed to read guess.");
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

rod*_*igo 5

阴影是一种纯粹的句法现象。它对生成的代码没有影响,也就是说,如果为每个变量选择不同的名称,生成的代码将是相同的。只是隐藏的变量不能通过名称引用。

特别是,在您的代码中:

    let mut guess = String::new(); //1
    ...    
    loop {
        io::stdin().read_line(&mut guess)... //2
        let guess: u32 =  match guess.trim()... ; //3
        match guess.cmp(...) // 4
    }
    //5
Run Code Online (Sandbox Code Playgroud)

第2行和第3行的用法引用了第1行中声明的变量,而第4行中的用法引用了第3行中的声明。变量的类型没有变化,生存期也没有任何变化。简而言之,它们是两个不同的变量,但碰巧具有相同的名称,因此您的程序不可能从第 4 行访问第 1 行中的变量。

事实上,在循环结束后,在第 5 行中,该名称guess将再次引用第 1 行中的变量,因为另一个变量超出了范围。