You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中含panic!的模式匹配类型检查规则疑问

Rust中!类型与类型检查规则解析

核心结论

{panic!("bad");}的类型确实是!(从不类型),这不是编译器的特殊处理,而是panic!宏本身的返回类型就是!。

详细解释

  1. 什么是!类型
    !是Rust的「从不类型」,表示该表达式永远不会正常返回——要么触发panic终止程序,要么进入无限循环,要么直接退出进程。它的核心特性是:可以被强制转换为任何其他类型,因为它永远不会实际返回值,编译器允许它出现在需要任意类型的位置。

  2. 块表达式的类型规则
    Rust里的块表达式{ ... },其类型由块内最后一个表达式决定:

  • 如果块的最后一个元素是!类型表达式(比如panic!),且后面没有其他代码,整个块的类型就是!。比如{ panic!("bad"); },因为panic!本身是!类型,块内没有后续表达式,所以这个块的类型是!,可以自动转换为i32,匹配函数的返回类型,因此works函数能通过检查。
  • 如果在!类型表达式之后添加了其他表达式(比如()),即使后续代码是不可达的,编译器仍会以最后一个表达式的类型作为块的类型。比如{ panic!("bad"); () },最后一个表达式是(),所以整个块的类型是()。而()无法转换为i32,因此fails函数会触发E0308类型不匹配错误,同时因为panic!之后的代码永远不会执行,还会出现不可达代码警告。
  1. panic!的本质
    panic!宏的返回类型就是!,这是Rust语言规范明确定义的行为,并非编译器的特殊处理。类似的还有loop {}(无限循环)、std::process::exit(1)(直接退出进程)等,这些表达式的类型都是!。

内容的提问来源于stack exchange,提问作者Barry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:03:24