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.