2016-12-13 1 views
3

QUESTIONQuelle est Implicite pour nécessaire dans firstCompletedOf à Scala

C'est un extrait de scala.concurrent.Future

def firstCompletedOf[T](futures: TraversableOnce[Future[T]])(implicit executor: ExecutionContext): Future[T] = { 
    val p = Promise[T]() 
    val completeFirst: Try[T] => Unit = p tryComplete _ 
    futures foreach { _ onComplete completeFirst } 
    p.future 
    } 

Ma question est, pourquoi avons-nous besoin d'une ExecutionContext implicite ici? Que fait-il dans ce cadre?

CONTEXTE

Commutation de Java vers Python j'été bouleversé par le fait que ce qui suit est pas un programme Python correct:

print("some string" + 42) 

Vous devez ajouter la conversion explicite, cette volonté travail:

print("some string " + str(42)) 

Ensuite, j'ai commencé à programmer en Scala, et en quelque sorte les implicits commencé à être mon nig htmare:

J'ai lu pas mal d'articles (this étant le meilleur) sur implicits et je ne suis toujours pas convaincu, pourquoi avons-nous besoin d'implicits en scala !? À mon avis, à long terme, les implicites rendent votre code difficile à comprendre. Depuis le passage à scala, j'ai commencé à vraiment aimer les "explicits" (même si j'aime vraiment les scala).

Quelqu'un pourrait-il me diriger vers d'autres ressources sur le sujet?

Répondre

4

Dans ce contexte spécifique, le rappel onComplete nécessite un contexte d'exécution.

def onComplete[U](f: (Try[T]) ⇒ U)(implicit executor: ExecutionContext): Unit 

L'intuition est que nous avons besoin des ressources de calcul pour exécuter la logique dans la fermeture du rappel une fois que l'avenir a terminé dans son propre contexte d'exécution. Quant à la discussion générale sur implicits, ils sont un outil puissant. Citant Ben Parker, "avec une grande puissance, vient une grande responsabilité"

2

Une grande ressource est en fait scala propre documentation.

Dans firstCompletedLe contexte d'exécution est responsable des calculs des contrats à terme.

+0

Je voudrais que la réponse soit plus spécifique, c'est-à-dire, ce que ExecutionContext fournit à cette portée - un équivalent de la 'str (_)' dans mon Exemple Python – GA1

+0

Le contexte que vous devez utiliser dépend de votre problème. Vous pouvez toujours revenir à scala.concurrent.ExecutionContext.global, qui est soutenu par un ForkJoinPool, mais si vous l'utilisez dans un projet plus grand avec beaucoup de computations asynchrones, vous devriez utiliser votre propre contexte d'exécution, qui pour le test et le développement fins pourrait être le contexte standard. –