Rust阴影变量类型自动更改



我指的是guess变量的类型。似乎变化类型从String然后i32然后回String

use std::{any::Any, io};
fn print_type_of<T>(_: &T) {
println!("{}", std::any::type_name::<T>())
}
fn main() {
let mut guess = String::new();
loop {
print_type_of(&guess);
guess.clear();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: i32 = match guess.trim().parse() {
Ok(x) => x,
Err(_) => continue,
};
print_type_of(&guess);
if guess == 69 {
break;
}
}
println!("{}", guess);
}

我可以理解在线性和范围上下文中遮蔽的概念。但是在guess被遮蔽并变成i32之后,我惊讶地发现,当回到循环的顶部时,它突然变回了String类型!

阴影不遵循控制流程,它与源代码是线性的。在循环条目中,有一个类型为Stringguess。在声明let guess: i32时,引入了一个名为guess的新变量,其类型为i32。您无法访问原始的guess,因为它是阴影,但它仍然在那里。我们不"再次循环":我们只是检查当前作用域中所有的guess变量,您引用的是最近的一个。当你在第二个guess声明之后,它就是它;当你在第一个guess之前。如果您将每个变量看作带有一个数字,您可能会发现它更自然:

fn main() {
let mut guess_1 = String::new();
loop {
print_type_of(&guess_1);
guess_1.clear();
io::stdin()
.read_line(&mut guess_1)
.expect("Failed to read line");
let guess_2: i32 = match guess_1.trim().parse() {
Ok(x) => x,
Err(_) => continue,
};
print_type_of(&guess_2);
if guess_2 == 69 {
break;
}
}
println!("{}", guess_1);
}

相关内容

  • 没有找到相关文章

最新更新