匹配手臂说类型不匹配

Match Arm saying type mismatch

我按照Rust Book Chapter 2写了下面的程序

在这里,我非常喜欢match关键字
#1

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess A Number");

    let secret_number = rand::thread_rng().gen_range(1, 101);
    
    loop {
        println!("Enter the Number:");

        let mut guess = String::new();
        io::stdin()
            .read_line(&mut guess)
            .expect("Unable to Read the Input");

        //The following snippet of code
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                println!("Not A Number, Try Again");
                continue;
            }
        };
        //end

        println!("Your Guess {}", guess);

        match guess.cmp(&secret_number) {
            
            Ordering::Greater => println!("Too Big"),
            Ordering::Less => println!("Too Small"),
            Ordering::Equal => {
                println!("You Win");
                break;
            }
        }
    }
}

所以我在做第3章末尾给出的问题时使用了match语句

#2:

use std::io;

fn main() {
    println!("Enter the number:");

    let mut term = String::new();

    io::stdin()
        .read_line(&mut term)
        .expect("\nFailed to Read");
  
    //The following snippet
    let term: u32 = match term.trim().parse() {
        Ok(num) => num,
        Err(_) => {
            println!("Input Not a Number");
            continue;
        }
    };
    //end
}

但是在#2 中,编译器给出了以下错误:

 mismatched types

 expected `u32`, found `()` 

并且出现如下错误

`continue` outside of a loop

我真的不明白为什么会出现此错误。可能是新手的错误。

请告诉我我的错误。

谢谢

编辑器:VS Code

扩展:rust-lang、rust-analyzer

类型不匹配的错误是因为term的类型被显式指定为u32,第一个match arm隐式returning u32,但是第二个match arm是returning 单位值 ()。只有几种方法可以退出匹配表达式,在这里您需要 return 一个 u32(您可能不想这样做),或者您可以调用 return 退出函数,或者调用 panic!() 来终止程序。 continue 关键字只能在循环内部使用,不能在匹配中使用。不幸的是,C switch 语句中没有等同于 break 的东西。

如果您不想立即从函数中 return,您可以重写它以存储由 parse() 编辑的结果 return,然后使用一个 if let 语句来检查错误,但最好创建一个可以从中 returned 的函数,其中包含匹配语句,然后从 main() 调用该函数。由于 Rust 编译器使用积极的优化(至少在使用 --release 编译时),它实际上可能会完全消除该函数,因此使用大量函数不会像在 C

中那样受到相同的惩罚