Au début, je l'avais cru que l'utilisation des underscores pour faire des fermetures (par exemple println _
) étaient juste un raccourci pour l'aide d'une flèche (par exemple x => println x
), mais j'appris récemment que vous pouvez également effectuer les opérations suivantes:Dans Scala, quelles sont les règles pour faire des fermetures avec des underscores?
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce(f _)
Compte tenu mes hypothèses passées, f _
ressemble à une fermeture qui accepte exactement un argument et passe exactement un argument à f
. J'ai supposé qu'il me dirait qu'il ne pourrait pas compiler parce que f
attend deux arguments, et reduce
devrait s'attendre à une fonction avec deux arguments. Mais cela fonctionne comme si j'avais écrit:
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce((x, y) => f(x, y))
Que se passe-t-il ici? Quelles sont les règles pour créer des fermetures avec des underscores?
Dans votre cas, 'f _' est un type de fonction utilisant le mécanisme d'expansion eta. Autrement dit, il traduit la méthode 'f (a: Int, b: Int): Int' en' (Int, Int) => Int' (c'est-à-dire 'Function2 [Int, Int, Int]'), qui est un type valide à fournir pour réduire. –
(aussi comme une note rapide, votre fonction n'est pas associative, ce qui a brisé le contrat requis par réduire) –
@ math4tots aussi, sachez que 'f _' et' f (_) 'sont deux choses différentes. – fxlae