声明一个不会在Scala中返回的函数

ant*_*one 14 scala

是否可以在Scala中声明“不返回”功能?即

def abort(): ! = {
    System.exit(1);
}
Run Code Online (Sandbox Code Playgroud)

!本例中的取自Rust,这意味着:进入此函数是单程旅行,我们将永远不会从中返回)

Tra*_*own 11

这正是Nothing类型所代表的含义-一种永远不会返回值的方法或表达式。这是引发异常的表达式的类型,例如:

scala> :type throw new Exception()
Nothing
Run Code Online (Sandbox Code Playgroud)

Scala还???为该类型提供了一个特殊的运算符,通常用于在开发过程中获取用于类型检查的代码。

scala> :type ???
Nothing
Run Code Online (Sandbox Code Playgroud)

Nothing是其他所有内容的子类型,因此您可以Nothing在需要任何类型的任何地方使用类型的表达式。


Bri*_*hon 10

使用没有

def loop: Nothing = loop
Run Code Online (Sandbox Code Playgroud)

这种类型的表达式不能正常返回,但是可以进入无限循环或引发异常。但是,您不能在示例中使用Nothing,因为System.exit有一个签名,表明它返回Unit。相反,您可以尝试执行以下操作使编译器满意:

def abort(): Nothing = {
  System.exit(1);
  ???  // Unreachable
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用sys.exit()。:) (2认同)