2010-01-18 6 views

Répondre

27

À mon avis, si vous essayez de rendre les choses plus claires, il vaut mieux documenter l'attente de l'identifiant x en y ajoutant une annotation de type là plutôt que le résultat de la fonction. Ensuite, le compilateur s'assurera que la fonction sur le côté droit répond à cette attente.

+0

Vous ne savez pas exactement ce que vous entendez par * que la fonction du côté gauche répond à cette attente *, la définition d'un type pour le bloc de résultats garantit également que le type est correct, par ex. 'val x =() => {System.currentTimeMillis}: String' ne compile pas. Ou voulez-vous dire autre chose? –

+0

La réponse de Geoff a l'avantage que vous obtenez le type complet à l'avant. Si vous avez une longue définition de fonction (multiligne), il est plus rapide de comprendre ce qui se passe si le type est au début. La réponse de Fabian a l'avantage d'être moins répétitive (particulièrement bonne pour les définitions courtes (une ligne), et plus rapide à comprendre si vous pouvez tout graver en un coup d'œil). –

+0

Oh, maintenant je vois le point de Geoff, sa définition de type contient le type d'entrée, qui est ici '()', et qui est vérifié lorsque la fonction '() => System.currentTimeMillis' est assignée à' x'. –

37
val x =() => { System.currentTimeMillis } : Long 
+0

Cela a résolu mon problème. Cela a rendu beaucoup moins verbeux que d'utiliser l'approche de la fonction #. –

+0

semble que 'val x =() => Long = {blah}' serait une syntaxe plus intuitive. Merci d'avoir répondu! – wbarksdale

9

Fabian a donné la façon simple, mais d'autres façons si vous aimez microgestion sucre comprennent:

val x = new (() => Long) { 
    def apply() = System.currentTimeMillis 
} 

ou

val x = new Function0[Long] { 
    def apply() = System.currentTimeMillis 
} 

ou même

val x = new { 
    def apply(): Long = System.currentTimeMillis 
} 

puisque dans la plupart des situations, il ne fait aucune différence s'il descend de Fonction, seulement s'il a une application.

Questions connexes