Quando si chiama una funzione, si chiama effettivamente il metodo apply della funzione. In altre parole, dato questo:
def doImport(fileImportID: Int, filename: String) {
println(s"Importing file #$fileImportID ($filename)")
}
il seguente frammento:
val f = doImport _
f(123, "file.txt")
... è zucchero sintattico per:
val f = doImport _
f.apply(123, "file.txt")
Se c'è un luogo in cui il compilatore cercherà i nomi degli argomenti durante una chiamata con parametri denominati, che è necessariamente nella definizione del metodo apply
. Si scopre che in Function2
, tali argomenti sono denominati v1
e v2
. Così possiamo fare:
scala> f.apply(v1=123, v2="file.txt")
Importing file #123 (file.txt)
Ora vediamo se funziona ancora quando si utilizza lo zucchero sintattico (in altre parole, quando si rimuove la chiamata esplicita a apply
):
scala> f(v1=123, v2="file.txt")
Importing file #123 (file.txt)
Nizza, funziona. Ora, naturalmente, v1
e v2
non è proprio la stessa fileImportID
e filename
, ma possiamo rimediare con un po 'di tipo raffinatezza:
type ImportFunc = ((Int, String)=>Unit) {
def apply(fileImportID: Int, filename: String): Unit
}
Fondamentalmente questo è solo (Int, String)=>Unit
(o in altre parole Function2[Int, String, Unit]
), ma con una ridefinizione di apply
con i nostri nomi argomento desiderati. Vediamo questo in azione:
scala> val f: ImportFunc = doImport _
f: ImportFunc = <function2>
scala> f(fileImportID=123, filename="file.txt")
Importing file #123 (file.txt)
successo!
Un'importante nota a margine: in termini di digitazione, lo ImportFunc
è identico allo Function2[Int, String, Unit]
oa qualsiasi altro raffinamento simile. Questo perché i nomi degli argomenti non fanno parte della firma.Quindi nel mio esempio f
può ancora essere passato ovunque sia previsto un Function2[Int, String, Unit]
(ma da quel punto non sarà più possibile chiamarlo usando i nomi degli argomenti personalizzati).
Non mi piace la classe case per avvolgere il valore per lo scopo di denominazione – cchantep
L'ho spostato su un'altra risposta. – skytteren
Non sono sicuro del motivo per cui l'hai spostato su un'altra risposta, se non per cercare di ottenere più risposte. Perché non mantenere entrambe le opzioni nella stessa poiché sono così simili. – kingdamian42