有没有理由在恐慌之后加上分号?

时间:2018-05-30 17:01:10

标签: rust

panic!("blah");panic("blah")之间是否存在差异?

据我所知,分号区分语句和表达式 1 。换句话说,缺少分号表明,由于表达式 2 ,预计会出现一个值。

在大多数情况下,这非常简单,但panic!会导致当前线程终止。该程序永远不会从panic!返回,因此表达式的结果毫无意义,对吗?

表达式panic!("blah")的表现是否与语句panic!("blah);不同?

1 个答案:

答案 0 :(得分:8)

在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")
}

这不是必需的,但对于读者而言,在这种情况下从panic!“返回”从不类型可能更明显。

  

panic!("blah");panic("blah")之间是否存在差异?

是的,前者是一种陈述,后者是一种表达。

  

panic!导致当前线程终止。

这是默认行为,是的,但它不是唯一的行为。未启用panic = abort时,you can catch panics if you need to