2016-07-20 11 views
6

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

Konsekwentnie otrzymuję 'scala.concurrent.impl.Promise $ DefaultPromise @ 34a2d6e0' ze Scala 2.11.7 –

+1

W 2.11.8 otrzymujesz' List() 'dla niezakończonej' Przyszłości'. –

+1

najprawdopodobniej masz ukryte ukryte definicje, które generują takie zachowanie. – Rumoku

Odpowiedz

8

To był niefortunny efekt uboczny usunięcia zależności sun.misc.Unsafe. Poprawiono go w Scali 2.12 i nowszych wersjach Scala 2.11 IIRC.

+1

Potwierdzenie poprawki jest w 2.11.9 w przygotowaniu. –

+4

Z ciekawości, czy możesz wyjaśnić, w jaki sposób 'sun.misc.Unsafe' odnosi się do' "List()" 'tutaj? – OlivierBlanvillain

+2

Zastąpiliśmy to rozszerzeniem AtomicReference, które niestety w milczeniu "przeszło" naString. Drukowalna lista to lista wywołań zwrotnych. –