Rufen Sie .toString
auf eine Zukunft, ohne auf Vollständigkeit zu warten, führt zu nicht deterministischen Ergebnissen. Meine Frage ist warum Aufruf .toString
auf unvollständige Futures gibt "List()"
in scala 2.10.x und 2.11.x zurück? The implementation scheint das nicht explizit zu sein.Warum gibt `Future # toString`` List() '`zurück?
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()
Beachten Sie, dass Scala 2.12.x wird Future#toString
wahrscheinlich explizit "Future(<not completed>)"
statt (source) zurückzukehren implementieren:
Dieses Verhalten kann aus dem REPL beobachtet werden.
Edit: Hinweise darauf, dass diese aus dem REPL kein Artefakt ist comming oder "einige implizite versteckt" (-Yno-predef
entfernt alle Standard 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")
Ich bekomme konsequent 'scala.concurrent.impl.Promise $ DefaultPromise @ 34a2d6e0' mit Scala 2.11.7 –
In 2.11.8 erhalten Sie' List() 'für eine unvollständige' Zukunft'. –
Sie haben höchstwahrscheinlich einige versteckte implizite definiert, die ein solches Verhalten generieren. – Rumoku