Объявите функцию, которая не возвращает в Scala

Можно ли объявить функцию "нет возврата" в Scala? Т.е.

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

(! в этом примере взято из Rust, и это означает: вход в эту функцию является поездкой в один конец, и мы никогда не вернемся из нее)

Ответ 1

Не используйте ничего:

def loop: Nothing = loop

Выражения этого типа не могут нормально возвращаться, но могут входить в бесконечные циклы или генерировать исключения. Тем не менее, вы не можете использовать Nothing в вашем примере, так как System.exit имеет подпись, говорящую, что он возвращает Unit. Вместо этого вы можете попробовать что-то вроде этого, чтобы сделать компилятор счастливым:

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

Ответ 2

Это именно то, что представляет тип Nothing - метод или выражение, которое никогда не будет возвращать значение. Это тип выражения, которое выдает исключение, например:

scala> :type throw new Exception()
Nothing

Scala также предоставляет специальный оператор ??? с этим типом, который обычно используется для проверки кода при проверке типов во время разработки.

scala> :type ???
Nothing

Nothing является подтипом всего остального, поэтому вы можете использовать выражение типа Nothing везде, где ожидается любой тип.

Ответ 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)

}

Ответ 4

Ничего не используйте, его основное назначение - сигнализировать о прекращении (официальная документация Scala https://www.scala-lang.org/api/2.9.3/scala/Nothing.html.) Обычно ничего не возвращает ничего, даже вычисления и используется для методов, которые постоянно генерируют исключения.