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;
}
};
}
}

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

特别是在您的代码中:

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

第 2 行和第 3 行中的用法是指第1 行中声明的变量,而第 4 行中的用法是指第 3 行中的声明。变量的类型没有变化,生存期也没有任何变化。简单地说,它们是碰巧具有相同名称的两个不同变量,因此您的程序将无法从第 4 行访问第 1 行中的变量。

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

最新更新