首页 > 解决方案 > 恐慌后有什么理由加分号吗?

问题描述

panic!("blah");和有区别panic("blah")吗?

据我了解,分号区分语句和表达式1。换句话说,缺少分号表明表达式2的结果是预期的值。

在大多数情况下,这非常简单,但panic!会导致当前线程终止。程序永远不会从那里返回panic!,所以表达式的结果是没有意义的,对吧?

表达式panic!("blah")的行为是否会与语句不同panic!("blah);

标签: rust

解决方案


在 99% 的情况下,没有有意义的差异。我只是让 rustfmt 做它想做的任何事情,而不去想它。

恐慌后有什么理由加分号吗?

是的。如果你决定在一些代码中间加入恐慌以进行一些快速而肮脏的调试,如果你不添加分号,你会得到一个语法错误:

fn main() {
    // ... some code ...

    // We add a quick panic for some reason
    panic!("oops")

    // ... some code ...
    1;
}
error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1`
 --> src/main.rs:8:5
  |
5 |     panic!("oops")
  |                   - expected one of `.`, `;`, `?`, `}`, or an operator here
...
8 |     1;
  |     ^ unexpected token

使用分号,您将能够在编译时出现一些关于无法访问代码的警告。

还有一个隐含的问题:

恐慌后有什么理由加分号吗?

我能想到的一个是当您编写自己的发散函数时:

fn crash_override() -> ! {
    panic!("oops")
}

这不是必需的,但对于读者来说,在这种情况下,never 类型正在被“返回”,这可能看起来更明显panic!

panic!("blah");和有区别panic("blah")吗?

是的,前者是语句,后者是表达式。

panic!会导致当前线程终止。

这是默认行为,是的,但它不是唯一的。panic = abort未启用时,如果需要,您可以捕获恐慌


推荐阅读