2017-03-27 2 views
4

Voici le code que je suis en train de comprendre:zip Scala- à terme

object Tryouts extends App{ 
    val studentIds= Future{ 
     List("s1","s2","s3") 
    } 
    val details = studentIds zip(Future{List("Tim","Joe","Fin")}).map(x=>x.tail) 
    details.foreach(println) 
    Thread.sleep(1000) 

} 

Le problème:

val details = studentIds zip(Future{List("Tim","Joe","Fin")}).map(x=>x.tail)

ici si vous remarquez, je ne suis pas en utilisant un "" avant zip et juste donner un espace. Je suppose que . et l'espace fonctionne de la même manière et a également validé certaines questions de débordement de pile. l'expression ci-dessus avant d'appliquer une carte me donnera un Future [(List [String], List [String])]. alors quand je dis

.map(x=x.tail) should show compilation error in IDE because tail operation can be applied only on list and not for tuple. But it is actually executing successfully.

The same statement when executed with "." before zip function like this:

val details = studentIds.zip(Future{List("Tim","Joe","Fin")}).map(x=>x.tail) the map(x=>x.tail) gives error.

quelle pourrait être la raison?

Répondre

6

Lorsque vous ne spécifiez pas l'espace (en remplaçant le .), vous devez aussi omettre les parenthèses, sinon le compilateur examinera tout ce qui vient après dans le cadre de l'expression initiale - dans votre cas, le map(x => x.tail) sera appliqué à la Future{List("Tim", "Joe", "Fin")}.

Un exemple simple peut observer ici:

val y = 3 to(5).toDouble 

Le #toDouble est effectivement appliqué au numéro 5. Si vous essayez d'utiliser la gamme des méthodes définies, il ne fonctionnera pas.

Pour en revenir à votre code, si vous supprimez le . avant l'appel de la queue, vous obtiendrez l'erreur de compilation attendue:

val details = ids zip Future.successful(List("Tim", "Joe", "Fin")) map (_.tail) 
// compile error: "Cannot resolve symbol tail" 
+1

Ce que vous devez omettre (et faire dans votre dernière ligne) n'est pas parenthèses autour de 'Future', c'est le point avant' map'. Sinon, vous devrez également les omettre dans 'map _.tail'. –