在Rust中,`!`作为返回类型有什么用途?

7

我最近看到了这样一段代码:

fn read() -> ! {
    unimplemented!()
}

fn read2() {
}

fn main() {
    read2();
    read();
}

我在任何地方都找不到关于fn read()返回类型为!的信息,所以我不知道这是什么以及它有什么用途。
我唯一发现似乎对我没用:

使用!作为返回类型告诉Rust编译器该函数永远不会返回

我不理解它的作用,因为省略类型也表示该函数不返回任何东西(实际上是unit类型)。

2
返回空值并不等同于从未返回。 - Lee
@Lee,看起来你知道答案,可以在这里回答并详细解释一下。 - Victor Polevoy
1
我会等待 Rust 程序员的回答,但我相信 ! 是空类型,因此具有该返回类型的函数永远不会正常返回(例如,它将引发 panic 或终止程序)。相比之下,() 是一个具有一个值的类型,因此具有该返回类型的函数仅用于其副作用的执行。 - Lee
@Lee 看起来你说得很对。 - Victor Polevoy
1个回答

7

单元 () 不是空的,它是一个类型,其唯一可能的值也写作 ()

此外,当函数返回单元(或者像您所说的“nothing”)时,它实际上返回了一个值。类型 Never 和符号 ! 规定函数永远不会返回,即退出程序。

通常这是 panic 宏的返回类型:

let s = match i {
    1 => "one",
    2 => "two",
    _ => panic!("Error"),
}

在这个例子中,注意到可以“扮演”所有类型的角色。编译器不会抱怨一个分支具有&str类型而另一个分支具有类型。
供您参考,这里是Never类型的一段小历史

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接