Bien que les fonctionnalités utilisées ne sont pas rares, je dois admettre que c'est une combinaison assez bizarre de fonctionnalités. Le truc de base est que n'importe quel bloc dans Scala est une expression, avec le même type que la dernière expression dans le bloc. Si cette dernière expression est une fonction, cela signifie que le bloc a un type fonctionnel, et peut donc être utilisé comme argument pour "map" ou "foreach". Ce qui se passe dans ces cas est que lorsque "map" ou "foreach" est appelé, le bloc est évalué. Le bloc évalue à une fonction (i => i * 5 dans le premier cas), et cette fonction est ensuite mappée sur la gamme.
Une utilisation possible de cette construction est que le bloc définisse des variables mutables et que la fonction résultante mute les variables chaque fois qu'elles sont appelées. Les variables seront initialisées une fois, refermées par la fonction et mises à jour à chaque fois que la fonction est appelée.
Par exemple, voici une manière quelque peu surprenante de calcul des 6 premiers nombres factoriels
(1 to 6) map {
var total = 1
i => {total *= i;total}
}
(BTW, désolé pour l'utilisation factoriel comme un exemple. Il était ça ou fibonacci. fonctionnels Progamming règles Guild. Vous avez un problème avec cela, prenez avec les garçons dans le couloir.)
Une raison moins impérative pour qu'un bloc retourne une fonction est de définir des fonctions d'aide plus tôt dans le bloc. Par exemple, si votre deuxième exemple était à la place
(1 to 3) foreach {
def line = Console.readLine
i => println(line)
}
Le résultat serait que trois lignes ont été lu et repris une fois chacun, tandis que votre exemple avait la ligne une fois lu et repris trois fois.
Réponse beaucoup plus précise que la mienne. +1 – VonC
Dans l'exemple factoriel, vous devez utiliser 'total * = i' au lieu d'introduire une deuxième variable nommée' counter' –
Oui, je m'en suis rendu compte plus tard. Éditera –