匹配 Arm 说类型不匹配

时间:2021-03-12 15:42:41

标签: rust compiler-errors match

我按照 Rust Book 第 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

1 个答案:

答案 0 :(得分:0)

类型不匹配错误是因为term的类型明确指定为u32,第一个匹配臂隐式返回u32,而第二个匹配臂返回单位值()。退出匹配表达式的方法只有几种,在这里你要么需要返回一个 u32(你可能不想这样做),要么你可以调用 return 退出函数,或者调用 panic!( ) 终止程序。 continue 关键字只能在循环内使用,但不能匹配。不幸的是,没有与 C switch 语句中的 break 等效。

如果你不想马上从函数中返回,你可以重写这个来存储 parse() 返回的 Result ,然后使用 if let 语句来检查错误,但是最好创建一个可以从中返回的函数,其中包含 match 语句,然后从 main() 调用该函数。由于 Rust 编译器使用激进的优化(至少在使用 --release 编译时),它实际上可能完全消除该函数,因此使用大量函数不会像在 C 中那样受到相同的惩罚

相关问题