Les mathématiciens ont leurs propres petites manières amusantes, donc au lieu de dire "alors nous appelons la fonction en la f
passant x
comme paramètre" comme diraient les programmeurs, ils parlent "d'appliquer la fonction f
à son argument x
".
En mathématiques et en informatique, Apply est une fonction qui applique des fonctions aux arguments.
Wikipédia
apply
sert à combler le fossé entre les paradigmes orientés objet et fonctionnels dans Scala. Chaque fonction dans Scala peut être représentée comme un objet. Chaque fonction a également un type OO: par exemple, une fonction qui prend un Int
paramètre et renvoie un Int
aura le type OO de 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
Puisque tout est un objet dans Scala, vous f
pouvez maintenant le traiter comme une référence à un Function1[Int,Int]
objet. Par exemple, nous pouvons appeler une toString
méthode héritée de Any
, cela aurait été impossible pour une fonction pure, car les fonctions n'ont pas de méthodes:
f.toString
Ou nous pourrions définir un autre Function1[Int,Int]
objet en appelant la compose
méthode f
et en enchaînant deux fonctions différentes ensemble:
val f2 = f.compose((x:Int) => x - 1)
Maintenant, si nous voulons réellement exécuter la fonction, ou comme le dit le mathématicien "appliquer une fonction à ses arguments", nous appellerions la apply
méthode sur l' Function1[Int,Int]
objet:
f2.apply(2)
Écrire f.apply(args)
chaque fois que vous voulez exécuter une fonction représentée comme un objet est la méthode orientée objet, mais ajouterait beaucoup d'encombrement au code sans ajouter beaucoup d'informations supplémentaires et il serait bien de pouvoir utiliser une notation plus standard, telle comme f(args)
. C'est là que le compilateur Scala intervient et chaque fois que nous avons une référence f
à un objet fonction et écrivons f (args)
pour appliquer des arguments à la fonction représentée, le compilateur se développe silencieusement f (args)
à l'appel de méthode objet f.apply (args)
.
Chaque fonction dans Scala peut être traitée comme un objet et cela fonctionne également dans l'autre sens - chaque objet peut être traité comme une fonction, à condition d'avoir la apply
méthode. De tels objets peuvent être utilisés dans la notation de fonction:
// 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
Il existe de nombreux cas d'utilisation où nous voudrions traiter un objet comme une fonction. Le scénario le plus courant est un modèle d'usine . Au lieu d'ajouter de l'encombrement au code à l'aide d'une méthode d'usine, nous pouvons nous apply
opposer à un ensemble d'arguments pour créer une nouvelle instance d'une classe associée:
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)
La apply
méthode n'est donc qu'un moyen pratique de combler l'écart entre les fonctions et les objets dans Scala.