Wywoływanie .toString
w sprawie przyszłości bez oczekiwania na kompilację prowadzi do wyników niedeterministycznych. Moje pytanie brzmi: dlaczego wywoływanie .toString
na niezakończonych kontraktach futures zwraca "List()"
w scala 2.10.x i 2.11.x? The implementation nie wydaje się być jednoznaczna.Dlaczego `Przyszłe # toString` zwraca` "List()" `?
Takie zachowanie można zaobserwować od REPL:
scala> import scala.concurrent.Future, scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global
scala> Future(1).toString
res0: scala.concurrent.Future[Int] = Success(1)
scala> Future(1).toString
res1: scala.concurrent.Future[Int] = List()
Zauważ, że Scala 2.12.x najprawdopodobniej wyraźnie wdrożenia Future#toString
wrócić "Future(<not completed>)"
zamiast (source).
Edit: dowody, że to nie jest artefaktem comming z REPL lub "niektóre ukryte ukryte" (-Yno-predef
usuwa wszystkie domyślne implicits):
Future.scala:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Main extends App {
System.out.println(Future(1).toString)
}
build.sbt:
scalaVersion := "2.11.8"
scalacOptions := Seq(
"-deprecation",
"-encoding", "UTF-8",
"-feature",
"-unchecked",
"-Yno-predef",
"-Xfatal-warnings",
"-Xlint",
"-Yinline-warnings",
"-Yno-adapted-args",
"-Ywarn-dead-code",
"-Ywarn-unused-import",
"-Ywarn-numeric-widen",
"-Ywarn-value-discard",
"-Xfuture")
Konsekwentnie otrzymuję 'scala.concurrent.impl.Promise $ DefaultPromise @ 34a2d6e0' ze Scala 2.11.7 –
W 2.11.8 otrzymujesz' List() 'dla niezakończonej' Przyszłości'. –
najprawdopodobniej masz ukryte ukryte definicje, które generują takie zachowanie. – Rumoku