我正在尝试学习 Rust,为了做到这一点,我创建了下面的练习,将华氏温度转换为摄氏度,反之亦然。
use std::io;
fn show_options() {
println!("You want to convert to:");
println!("\t1. Celsius");
println!("\t2. Fahrenheit");
println!("Type your option number:");
}
fn print_invalid() {
println!("Invalid option. Choose 1 or 2:\n")
}
fn main() {
let result;
let mut input = String::new();
let mut temp = String::new();
let input_num: u32 = 0;
loop {
input.clear();
show_options();
io::stdin()
.read_line(&mut input)
.expect("Failed to read line");
let input_num: u32 = input.trim().parse().unwrap();
match input_num {
1 => break,
2 => break,
_ => {
print_invalid();
continue;
},
};
};
println!("What's the temperature?");
io::stdin()
.read_line(&mut temp)
.expect("Failed to read line");
let temp_num: f32 = temp.trim().parse().unwrap();
// from F to C
if input_num == 1 {
result = (temp_num-32.0)*1.8;
print!("The {temp_num}°F is {result}°C");
// From C to F
} else {
result = (temp_num*1.8) + 32.0;
print!("The {temp_num}°C is {result}°F");
};
}
问题是最后一个
if
的第一个条件从未满足,我不明白为什么。使用调试器,我可以看到 input_num
变量将其值从用户输入选择的值(假设为 1)切换为 0,但我无法理解为什么。
如果更有经验的 Rust 程序员可以告诉我我的代码发生了什么,我会很高兴。
您有两个
input_num
。
在循环之外,您声明了
let input_num = 0;
。这是循环外代码的 input_num
,它始终为零。
里面有另一个,
let input_num: u32 = input.trim().parse().unwrap();
。在创建循环的每次迭代中,它都会消失:它不存在于循环之外。这个变量shadows第一个input_num
。
一个可疑的迹象是您没有将第一个
input_num
声明为 mut
,这意味着它是不可改变的。因此,它将始终保持其初始值零。
由于您在循环之外访问
input_num
,因此您正在访问第一个,它始终为零。
相反,将第一个
input_num
标记为 mut
,并从第二个 let
中删除 input_num
,使其成为赋值而不是声明。