2016-07-20 20 views
6

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") 
+1

Ich bekomme konsequent 'scala.concurrent.impl.Promise $ DefaultPromise @ 34a2d6e0' mit Scala 2.11.7 –

+1

In 2.11.8 erhalten Sie' List() 'für eine unvollständige' Zukunft'. –

+1

Sie haben höchstwahrscheinlich einige versteckte implizite definiert, die ein solches Verhalten generieren. – Rumoku

Antwort

8

Es war ein unglücklicher Nebeneffekt der Beseitigung der Abhängigkeit von sun.misc.Unsafe. Es ist in Scala 2.12 und neueren Versionen von Scala 2.11 IIRC korrigiert.

+1

Das Update wird am 2.11.9 in Kürze bestätigt. –

+4

Aus Neugier, könnten Sie erklären, wie 'sun.misc.Unsafe' sich auf" List() "hier bezieht? – OlivierBlanvillain

+2

Wir ersetzten es durch die Erweiterung AtomicReference, die leider still zu String "überfrachten". Die Liste, die gedruckt wird, ist die Liste der Rückrufe. –