2014-07-23 4 views
0

Quelqu'un pourrait-il s'il vous plaît expliquer ce morceau de code:Confus au sujet de cette syntaxe Scala

val ns: Iterator[Int] = (1 to 3).iterator 
ns.map(_ =>() => block) 

block: => Future[T] 

Fondamentalement, je suis juste confus au sujet de ce qui se passe avec le _, => et unité () syntaxe. La façon dont j'essaie de le lire est 'nous mappons une fonction qui retourne une fonction qui ne prend pas de paramètres et retourne un Futur [T] sur la liste des entiers'. Est-ce correct? Je suis toujours confus quand je vois plusieurs opérateurs => dans une rangée ..

+0

Je trouve cette réponse par C. Sobral comme @ Daniel la meilleure explication jusqu'à ce jour: http://stackoverflow.com/questions/4543228/whats-the-difference-between-and-unit/4545703#4545703 –

Répondre

2

Oui, vous avez raison.

Il est analysé comme ceci:

ns.map(_ => (() => block)) 

Et la syntaxe () => ? est simplement définir une fonction parameterless:

val f =() => 1 
f() // 1 

Ainsi, le nombre entier ns est ignoré, et vous obtenez juste une iterator de fonctions qui ne prennent aucun paramètre et retournent des contrats à terme: Iterator[() => Future[T]].

+0

L'opérateur => est-il donc associatif? (est-ce un opérateur?) – jcm

0

Je pense que ce bloquer: => Future [T] peut-être la signature de la méthode. Cela signifie appel par nom. En gros, vous pouvez comprendre qu'il est juste un type avenir [T] qui est paresseux évalué mais pas une fonction

val ns: Iterator[Int] = (1 to 3).iterator 
ns.map(_ =>() => block) 

Cela renverra Iterator [() => Future], donc oui, vous avez raison, ce transformer en une fonction qui ne prend rien à l'avenir. La bonne chose de ceci est que cela n'évaluera pas le Futur immédiatement, il sera appelé quand vous l'invoquerez.

val result = ns.map(_ =>() => block) 

result.foreach(_())