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

时间:2019-08-30 05:45:44

标签: scala

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

def abort(): ! = {
    System.exit(1);
}

(此示例中的!取自Rust,它的意思是:进入此功能是单程旅行,我们将永远不会从中返回)

4 个答案:

答案 0 :(得分:11)

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

scala> :type throw new Exception()
Nothing

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

scala> :type ???
Nothing

Nothing是其他所有内容的子类型,因此可以在任何期望的类型中使用类型Nothing的表达式。

答案 1 :(得分:10)

使用Nothing

def loop: Nothing = loop

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

def abort(): Nothing = {
  System.exit(1);
  ???  // Unreachable
}

答案 2 :(得分:3)

一些真实的例子:

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.stream.ActorMaterializer
import zio._

object Server extends App {
  val program: ZIO[Any, Throwable, Nothing] =
    UIO(ActorSystem()).bracket(terminateSystem) { implicit system =>
      implicit val mat = ActorMaterializer()
      for {
        _ <- IO.fromFuture { _ =>
          Http().bindAndHandle(routes, "localhost", 8080)
        }
        _ <- IO.never
      } yield ()
    }

  def run(args: List[String]) = program.fold(_ => 1, _ => 0)

}

答案 3 :(得分:0)

不使用任何内容,其主要用途是发出终止信号。(Scala官方文档https://www.scala-lang.org/api/2.9.3/scala/Nothing.html。) 通常,什么也不会返回任何东西,即使是计算也不会返回任何东西,并用于连续抛出异常的方法。