< 返回版块

QuantumBear 发表于 2020-10-31 21:51

Tags:新手

来自Rust Book第一章的示例程序

    let input_number: u32 = match input_number.trim().parse() {
        Ok(number) => number,
        Err(_) => { println!("invalid input, exit"); break;}
    };

这里我不理解的地方在,match的两个arm上,为什么类型可以完全不一致,Ok这边返回一个u32,但是Err这边应该是个(),一般pattern match不应该两边的类型一致吗?

评论区

写评论
AlephAlpha 2020-11-09 12:09

https://doc.rust-lang.org/stable/std/primitive.never.html

hzqd 2020-11-04 15:51

正如其他网友所说:break 的类型是 ! 类型,也称为 bottom type,即永远没有返回值;因此,编译器自动类型推导为 number 的类型 —— 即:u32。

不过,你也可以考虑采用 Option 类型封装一层:

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

fn main() {
    println!("Guess the number!");
    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Please input your guess.");
        let mut guess = String::new();
        io::stdin().read_line(&mut guess).expect("Failed to read line");

        let guess: Option<u32> = match guess.trim().parse() {
            Ok(num) => Some(num),
            Err(_) => {
                println!("wrong number");
                None
            }
        };

        if let Some(x) = guess {
            println!("You guessed: {}", x);

            match x.cmp(&secret_number) {
                Ordering::Less => println!("Too small!"),
                Ordering::Greater => println!("Too big!"),
                Ordering::Equal => {
                    println!("You win!");
                    break;
                }
            }
        }
    }
}
azone 2020-11-02 11:56

break 是 never 类型,这个时候已经跳出循环了,不会再继续执行了

chirsz-ever 2020-11-01 15:47

查了查reference,没找到 break; 推断为 Never Type 的描述,也没有 Statement 一定是 () 的描述……

rdigua 2020-11-01 08:54

enum Result<T, E> { Ok(T), Err(E), }

gwy15 2020-10-31 22:33

可以看看 https://doc.rust-lang.org/book/ch19-04-advanced-types.html#the-never-type-that-never-returns

gwy15 2020-10-31 22:30

Err 这个分支不是 (),而是 ! (unreachable),会直接跳出循环

1 共 7 条评论, 1 页