rust 为什么慌!(_)可以返回带或不带;?

tkclm6bt  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(124)

看着问题编号3here
作为一个例子,我已经编辑了。

fn main() {
    never_return();
    // println!("Failed!");
}

fn never_return() -> ! {
    // Implement this function, don't modify the fn signatures
    panic!("stop")
}

当从fn返回内容时,期望没有尾随的;。在上面的例子中,panic!(_)返回类型never,并执行我期望它执行的操作。但是,返回!的相同fn签名,不管panic宏后面是否有;,都编译为相同的值。我假设这是因为panic的内部函数?但找不到一个我能理解的技术解释。
为什么会这样呢?

4ioopgfo

4ioopgfo1#

我想你误解了!类型。panic!宏并不是“永远不返回类型”,而是永远不返回。通过使用fn foo() -> !签名,你就声明了这个函数实际上永远不返回,并调用另一个永远不返回的函数/宏来满足这一点。类似地,下面的编译器:

fn never_returns() -> ! {
  loop { }
}

因为它永远循环,所以它 * 永远 * 不返回

相关问题