2010-07-13 2 views

risposta

14
val f: Function2[Simple, String, Int] = _.doit(_) 
+1

Chiamata "applicazione parziale". Come mostra qui è un caso speciale. Come suggerisce il nome, alcuni argomenti possono essere forniti nell'applicazione parziale e la funzione risultante ha arity N-M dove N era l'aritmetica del metodo originale (o della funzione) e M è il numero di argomenti risolti nell'applicazione parziale. –

+0

Perfetto. Mi stavo chiedendo come il compilatore avrebbe capito se il metodo doit esiste davvero; Vedo che la digitazione esplicita fa il trucco qui. Grazie! –

12

stessa sepp2k, semplicemente utilizzando un altro sintassi

val f = (s:Simple, str:String) => s.doit(str) 
9

Per quelli tra voi che non godono di tipi di battitura:

scala> val f = (_: Simple).doit _ 
f: (Simple) => (String) => Int = <function1> 

seguendo un metodo per _ lavori per per qualsiasi sei:

scala> trait Complex {       
    | def doit(a: String, b: Int): Boolean 
    | }          
defined trait Complex 

scala> val f = (_: Complex).doit _    
f: (Complex) => (String, Int) => Boolean = <function1> 

Questo è coperto da una combinazione di §6.23 "Sintassi segnaposto per funzioni anonime" e §7.1 "Valori metodo" di Scala Reference

+0

Quali sono le implicazioni pratiche di avere una funzione di tipo (Simple) => (String) => Int vs. di tipo (Simple, String) => Int? So che il primo è chiamato con f (obj) ("str") e il secondo con f (obj, "str"), e il primo restituisce un altro oggetto funzione se lo si chiama con una lista di parametri: f (obj). Ma cosa succede dietro le quinte in termini di numero di oggetti creati e numero di invocazioni del metodo? –

+0

Vengono creati due oggetti Function1 anziché un oggetto Function2, con un livello aggiuntivo di riferimento indiretto. – retronym