来自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不应该两边的类型一致吗?
1
共 7 条评论, 1 页
评论区
写评论https://doc.rust-lang.org/stable/std/primitive.never.html
正如其他网友所说:break 的类型是 ! 类型,也称为 bottom type,即永远没有返回值;因此,编译器自动类型推导为 number 的类型 —— 即:u32。
不过,你也可以考虑采用 Option 类型封装一层:
break 是 never 类型,这个时候已经跳出循环了,不会再继续执行了
查了查reference,没找到
break;
推断为 Never Type 的描述,也没有 Statement 一定是()
的描述……enum Result<T, E> { Ok(T), Err(E), }
可以看看 https://doc.rust-lang.org/book/ch19-04-advanced-types.html#the-never-type-that-never-returns
Err 这个分支不是
()
,而是!
(unreachable),会直接跳出循环