2010-06-26 6 views

Répondre

4

Comme mentionné dans Advantages of Scala’s Type System, il est un de type fonctionnel.

L'article Scala for Java Refugees Part 6: Getting Over Java décrit cette syntaxe dans sa section "Fonctions d'ordre supérieur".

def itrate(array:Array[String], fun:(String)=>Unit) = { 
    for (i <- 0 to (array.length - 1)) { // anti-idiom array iteration 
    fun(array(i)) 
    } 
} 

val a = Array("Daniel", "Chris", "Joseph", "Renee") 
iterate(a, (s:String) => println(s)) 

Voir? La syntaxe est si naturelle que vous la manquez presque.
En commençant par le haut, nous regardons le type du paramètre amusant et nous voyons la syntaxe (type1, …)=>returnType qui indique un type fonctionnel.
Dans ce cas, fun sera un fonctionnel qui prend un seul paramètre de type String et retourne Unit (effectivement void, donc rien du tout).
Deux lignes vers le bas dans la fonction, nous voyons la syntaxe pour réellement appeler le fonctionnel. le fun est traité comme s'il s'agissait d'une méthode disponible dans le scope, la syntaxe d'appel est identique.
Les vétérans des ombres du C/C++ reconnaîtront cette syntaxe comme étant un rappel de la manière dont les pointeurs de fonction étaient manipulés au jour le jour.
La différence est qu'il n'y a pas de fuites de mémoire à s'inquiéter, et pas de sur-verbosité introduite par trop de symboles étoiles.


Dans votre cas: def func(arg: String => Int): Unit, arg serait une fonction qui prend une chaîne et un retour Int.

9

Réponse courte

Sa fonction qui reçoit une chaîne et retourne un Int

Réponse longue

A Scala, les fonctions sont des citoyens de première classe. Cela signifie que vous pouvez les stocker dans des variables ou (comme dans ce cas) les passer en arguments.

Voilà comment un aspect littéral de fonction comme

() => Unit 

C'est une fonction qui ne reçoit pas des arguments et retourne l'unité (l'équivalent de Java pour annuler).

Ce serait une fonction qui reçoit une chaîne en tant que paramètre et retourne un Int:

(String) => Int 

De plus, scala nous a laissés vous laissez tomber la parenthèse comme une forme de sucre syntaxique, comme dans votre exemple. Le arg: précédent est juste le nom de l'argument.

intérieur func vous appelez la fonction reçue (arg) comme ceci:

val result = arg("Some String") // this returns a Int 
+0

Vous voulez dire 'arg' est une fonction qui .... Droite? –

+0

Ouais, laissez-moi éditer et clarifier –

4

Vous pouvez également le voir écrit (peut-être par un décompilateur) comme

def func(arg: Function1[String, Int]): Unit = { 
    // body of function 
} 

Ce sont précisément équivalents.

Questions connexes