Sono un po 'instabile sulle regole in merito a quando è necessario un _
dopo un metodo per utilizzarlo come funzione. Ad esempio, perché c'è una differenza tra Foo
e ::
in ::
?Perché e quando devo seguire un nome di metodo con _?
def square(n: Int) = n * n
object Foo { def ::(f: Int => Int) = f(42) }
// ...
scala> Foo.::(square)
res2: Int = 1764
scala> Nil.::(square)
<console>:6: error: missing arguments for method square in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
Nil.::(square)
^
scala> Nil.::(square _)
res3: List[(Int) => Int] = List(<function1>)
Grazie. Ho appena trovato una parte della Scala Language Spec che dà qualche giustificazione per il "perché", nelle note di modifica di Scala 2.0: "Le regole per le conversioni implicite dei metodi alle funzioni (§6.25) sono state rafforzate. In precedenza, un metodo parametrizzato utilizzato dato che un valore è sempre stato convertito implicitamente in una funzione, il che potrebbe portare a risultati imprevisti quando gli argomenti del metodo sono stati dimenticati. Prendiamo ad esempio la seguente istruzione: show (x.toString) ... " –