Можно ли объявить функцию "нет возврата" в Scala? Т.е.
def abort(): ! = {
System.exit(1);
}
(!
в этом примере взято из Rust, и это означает: вход в эту функцию является поездкой в один конец, и мы никогда не вернемся из нее)
Можно ли объявить функцию "нет возврата" в Scala? Т.е.
def abort(): ! = {
System.exit(1);
}
(!
в этом примере взято из Rust, и это означает: вход в эту функцию является поездкой в один конец, и мы никогда не вернемся из нее)
Не используйте ничего:
def loop: Nothing = loop
Выражения этого типа не могут нормально возвращаться, но могут входить в бесконечные циклы или генерировать исключения. Тем не менее, вы не можете использовать Nothing в вашем примере, так как System.exit имеет подпись, говорящую, что он возвращает Unit. Вместо этого вы можете попробовать что-то вроде этого, чтобы сделать компилятор счастливым:
def abort(): Nothing = {
System.exit(1);
??? // Unreachable
}
Это именно то, что представляет тип Nothing
- метод или выражение, которое никогда не будет возвращать значение. Это тип выражения, которое выдает исключение, например:
scala> :type throw new Exception()
Nothing
Scala также предоставляет специальный оператор ???
с этим типом, который обычно используется для проверки кода при проверке типов во время разработки.
scala> :type ???
Nothing
Nothing
является подтипом всего остального, поэтому вы можете использовать выражение типа Nothing
везде, где ожидается любой тип.
Пример из реального мира:
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)
}
Ничего не используйте, его основное назначение - сигнализировать о прекращении (официальная документация Scala https://www.scala-lang.org/api/2.9.3/scala/Nothing.html.) Обычно ничего не возвращает ничего, даже вычисления и используется для методов, которые постоянно генерируют исключения.