Mathematiker haben ihre eigene Art und Weise, also anstatt zu sagen "dann rufen wir die Funktion f
vorbeigehend x
als Parameter", wie wir Programmierer sagen würden, sie sprechen von "Funktion anwenden f
zu seinem Argument x
".
In der Mathematik und der Informatik ist "Anwenden" eine Funktion, die Funktionen auf Argumente anwendet.
Wikipedia
apply
dient dem Zweck, die Lücke zwischen objektorientierten und funktionalen Paradigmen in Scala zu schließen. Jede Funktion in Scala kann als Objekt dargestellt werden. Jede Funktion hat auch einen OO-Typ: zum Beispiel eine Funktion, die ein Int
Parameter und gibt eine Int
hat den OO-Typ von Function1[Int,Int]
.
// define a function in scala
(x:Int) => x + 1
// assign an object representing the function to a variable
val f = (x:Int) => x + 1
Da in Scala alles ein Objekt ist f
kann nun als ein Verweis auf Function1[Int,Int]
Objekt. Zum Beispiel können wir aufrufen toString
Methode geerbt von Any
Das wäre bei einer reinen Funktion unmöglich gewesen, da Funktionen keine Methoden haben:
f.toString
Oder wir könnten eine andere Function1[Int,Int]
Objekt durch Aufruf von compose
Methode auf f
und die Verkettung zweier verschiedener Funktionen:
val f2 = f.compose((x:Int) => x - 1)
Wenn wir nun die Funktion tatsächlich ausführen wollen, oder wie der Mathematiker sagt "eine Funktion auf ihre Argumente anwenden", würden wir die Funktion apply
Methode auf der Function1[Int,Int]
Objekt:
f2.apply(2)
Schreiben f.apply(args)
jedes Mal, wenn Sie eine Funktion ausführen wollen, die als Objekt dargestellt wird, ist der objektorientierte Weg, würde aber eine Menge Unordnung in den Code bringen, ohne viel zusätzliche Information hinzuzufügen, und es wäre schön, wenn Sie mehr Standardnotation verwenden könnten, wie z.B. f(args)
. An dieser Stelle greift der Scala-Compiler ein, und wann immer wir eine Referenz haben f
in ein Funktionsobjekt und schreiben f (args)
um Argumente auf die dargestellte Funktion anzuwenden, erweitert der Compiler stillschweigend f (args)
zum Aufruf der Objektmethode f.apply (args)
.
Jede Funktion in Scala kann als Objekt behandelt werden und es funktioniert auch umgekehrt - jedes Objekt kann als Funktion behandelt werden, vorausgesetzt es hat die apply
Methode. Solche Objekte können in der Funktionsschreibweise verwendet werden:
// we will be able to use this object as a function, as well as an object
object Foo {
var y = 5
def apply (x: Int) = x + y
}
Foo (1) // using Foo object in function notation
Es gibt viele Anwendungsfälle, in denen wir ein Objekt als Funktion behandeln möchten. Das häufigste Szenario ist ein Fabrikmuster . Anstatt den Code mit einer Fabrikmethode unübersichtlich zu machen, können wir apply
Objekt mit einer Reihe von Argumenten, um eine neue Instanz einer zugehörigen Klasse zu erstellen:
List(1,2,3) // same as List.apply(1,2,3) but less clutter, functional notation
// the way the factory method invocation would have looked
// in other languages with OO notation - needless clutter
List.instanceOf(1,2,3)
Also apply
Methode ist einfach eine praktische Möglichkeit, die Lücke zwischen Funktionen und Objekten in Scala zu schließen.