Appearance
4.2 发散函数
Rust 支持一种特殊的发散函数(Diverging functions),它的返回类型是感叹号!
。如果一个函数根本就不能正常返回,那么它可以这样写:
rust
fn diverges() -> ! {
panic!("This function never returns!");
}
因为 panic!
会直接导致栈展开,所以这个函数调用后面的代码都不会继续执行,它的返回类型就是一个特殊的!
符号,这种函数也叫作发散函数。发散类型的最大特点就是,它可以被转换为任意一个类型。比如:
rust
let x : i32 = diverges();
let y : String = diverges();
我们为什么需要这样的一种返回类型呢?先看下面的例子:
rust
let p = if x {
panic!("error");
} else {
100
};
上面这条语句中包含一个 if-else 分支结构的表达式。我们知道,对于分支结构的表达式,它的每条分支的类型必须一致。那么这条 panic!
宏应该生成一个什么类型呢?这就是!
类型的作用了。因为它可以与任意类型相容,所以编译器的类型检查才能通过。
在 Rust 中,有以下这些情况永远不会返回,它们的类型就是!
。
panic!
以及基于它实现的各种函数/宏,比如unimplemented!
、unreachable!
;死循环
loop { }
;进程退出函数
std::process::exit
以及类似的 libc 中的exec
一类函数。
关于这个!
类型,第 8 章在对类型系统做更深入分析的时候还会再提到。