Wenn Sie eine Funktion aufrufen, rufen Sie tatsächlich die Apply-Methode der Funktion auf. Mit anderen Worten, da dies:
def doImport(fileImportID: Int, filename: String) {
println(s"Importing file #$fileImportID ($filename)")
}
folgenden Ausschnitt:
val f = doImport _
f(123, "file.txt")
... ist nur syntaktischer Zucker für:
val f = doImport _
f.apply(123, "file.txt")
Wenn es einen Ort gibt, wo der Compiler sucht bei einem Aufruf mit benannten Parametern nach den Namen der Argumente, das ist notwendigerweise in der Definition der Methode apply
. Es stellt sich heraus, dass in Function2
diese Argumente v1
und v2
genannt werden. So können wir tun:
scala> f.apply(v1=123, v2="file.txt")
Importing file #123 (file.txt)
Nun wollen wir sehen, ob es noch funktioniert, wenn die syntaktische Zucker mit (in anderen Worten, wenn die expliziten Aufruf apply
entfernen):
scala> f(v1=123, v2="file.txt")
Importing file #123 (file.txt)
Nizza, es funktioniert. Jetzt natürlich v1
und v2
ist nicht ganz dasselbe wie fileImportID
und filename
, aber wir können mit etwas Art Verfeinerung, dass beheben:
type ImportFunc = ((Int, String)=>Unit) {
def apply(fileImportID: Int, filename: String): Unit
}
Im Grunde ist dies nur (Int, String)=>Unit
(oder mit anderen Worten Function2[Int, String, Unit]
), aber mit eine Neudefinition von apply
mit unseren gewünschten Argumentnamen. die in Aktion sehen dies Lassen:
scala> val f: ImportFunc = doImport _
f: ImportFunc = <function2>
scala> f(fileImportID=123, filename="file.txt")
Importing file #123 (file.txt)
Erfolg!
Eine wichtige Randnotiz: In Bezug auf die Typisierung ist ImportFunc
identisch mit Function2[Int, String, Unit]
oder zu irgendeiner anderen ähnlichen Verfeinerung. Dies liegt daran, dass Argumentnamen nicht Teil der Signatur sind.Also in meinem Beispiel f
kann immer noch irgendwo eine Function2[Int, String, Unit]
erwartet werden (aber von diesem Punkt werden Sie nicht mehr in der Lage sein, es mit Ihren benutzerdefinierten Argumentnamen aufzurufen).
Nicht gerne Case-Klasse zu Wert für die Namensgebung wrapping – cchantep
Ich zog dies zu einer anderen Antwort. – skytteren
Ich bin nicht sicher, warum Sie es auf eine andere Antwort verschoben haben, außer vielleicht versuchen, mehr Rep zu bekommen. Warum halten Sie nicht beide Optionen in der gleichen, da sie sich so ähnlich sind? – kingdamian42