为什么 Rust 代码中从未满足我的条件?

问题描述 投票:0回答:1

我正在尝试学习 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 程序员可以告诉我我的代码发生了什么,我会很高兴。

rust logic
1个回答
0
投票

您有两个

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
,使其成为赋值而不是声明。

© www.soinside.com 2019 - 2024. All rights reserved.