Le premier est un procédé sans argument f1
qui renvoie un Function1[Int, Int]
.
scala> def f1: (Int => Int) = (x: Int) => x * x
f1: (Int) => Int
La seconde est une méthode d'argument une f2
qui prend un un Int
et renvoie un Int
.
scala> def f2(x: Int): Int = x * x
f2: (x: Int)Int
Vous pouvez appeler f1 et f2 avec la même syntaxe, bien que lorsque vous appelez f1(2)
il est étendu à f1.apply(2)
.
scala> f1
res0: (Int) => Int = <function1>
scala> f1(2)
res1: Int = 4
scala> f1.apply(2)
res2: Int = 2
scala> f2(2)
res3: Int = 4
Enfin, vous pouvez 'lift' la méthode f2
à une fonction comme suit.
scala> f2
<console>:6: error: missing arguments for method f2 in object $iw;
follow this method with `_' if you want to treat it as a partially applied funct
ion
f2
^
scala> f2 _
res7: (Int) => Int = <function1>
scala> (f2 _).apply(2)
res8: Int = 4
exercice: Quel est le type de f1 _
?
ce n'est pas une réponse, mais je suppose que le second a le type de retour déduit et c'est la différence, car afaik Scala a une surcharge d'opérateur ce qui signifie que x * x ne doit pas être un Int. –
@Gabriel: Non, il n'y a pas de vérité là-dedans. –