Wenn ich in Scala eine Methode definiere, die apply
in einer Klasse oder einem Objekt der obersten Ebene aufgerufen wird, wird diese Methode immer dann aufgerufen, wenn ich ein Paar in Klammern an eine Instanz dieser Klasse anhänge und die entsprechenden Argumente apply()
dazwischen setze . Zum Beispiel:
class Foo(x: Int) {
def apply(y: Int) = {
x*x + y*y
}
}
val f = new Foo(3)
f(4) // returns 25
Also im Grunde object(args)
ist nur syntaktischer Zucker für object.apply(args)
.
Wie macht Scala diese Konvertierung?
Gibt es hier eine global definierte implizite Konvertierung, ähnlich den impliziten Typkonvertierungen im Predef-Objekt (jedoch in der Art unterschiedlich)? Oder ist es eine tiefere Magie? Ich frage, weil es den Anschein hat, als würde Scala die konsequente Anwendung eines kleineren Regelwerks nachdrücklich befürworten, anstatt viele Regeln mit vielen Ausnahmen. Dies scheint mir zunächst eine Ausnahme zu sein.
Antworten:
Ich glaube nicht , dass es etwas tiefer geht als das, was Sie ursprünglich gesagt haben: es ist nur syntaktischer Zucker , wobei der Compiler wandelt
f(a)
inf.apply(a)
eine spezielle Syntax Fall.Dies scheint eine bestimmte Regel zu sein, aber nur wenige davon (z. B. mit
update
) ermöglichen DSL- ähnliche Konstrukte und Bibliotheken.quelle
f
ist ein Objekt (einschließlich Funktionen)". Wannf
ist eine Methode, gibt es offensichtlich keine solche Übersetzung.f
es sich um eine Methode handelt, die ohne Parameterliste definiert ist,f(a)
wird sie tatsächlich als so etwas interpretiertval _tmp = f; _tmp.apply(a)
. Aber das kommt wirklich fest in das Gebiet der Haarspalterei.Es ist tatsächlich umgekehrt, ein Objekt oder eine Klasse mit einer Apply-Methode ist der Normalfall und eine Funktion ist eine Möglichkeit, implizit ein gleichnamiges Objekt mit einer Apply-Methode zu konstruieren. Tatsächlich ist jede von Ihnen definierte Funktion ein Unterobjekt des Merkmals Funktion n (n ist die Anzahl der Argumente).
Weitere Informationen zum Thema finden Sie in Abschnitt 6.6: Funktionsanwendungen der Scala-Sprachspezifikation .
quelle
Ja. Und diese Regel gehört zu dieser kleineren Menge.
quelle