是否可以在Scala中声明“不返回”功能?即
def abort(): ! = {
System.exit(1);
}
(此示例中的!
取自Rust,它的意思是:进入此功能是单程旅行,我们将永远不会从中返回)
答案 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。) 通常,什么也不会返回任何东西,即使是计算也不会返回任何东西,并用于连续抛出异常的方法。