web-dev-qa-db-fra.com

Comment fonctionne la magie de la méthode apply () de Scala?

Dans Scala, si je définis une méthode appelée apply dans une classe ou un objet de niveau supérieur, cette méthode sera appelée chaque fois que j'ajoute une paire entre parenthèses à une instance de cette classe et que je mets les arguments appropriés pour apply() entre eux. Par exemple:

class Foo(x: Int) {
    def apply(y: Int) = {
        x*x + y*y
    }
}

val f = new Foo(3)
f(4)   // returns 25

Donc, fondamentalement, object(args) est juste du sucre syntaxique pour object.apply(args).

Comment Scala procède-t-il à cette conversion?

Existe-t-il ici une conversion implicite définie globalement, similaire aux conversions de type implicite dans l'objet Predef (mais différentes en nature)? Ou est-ce une magie plus profonde? Je demande parce qu'il semble que Scala favorise fortement l'application cohérente d'un ensemble de règles plus petit, plutôt que de nombreuses règles avec de nombreuses exceptions. Cela me semble initialement être une exception.

79
Jeff

Je ne pense pas qu'il y ait quelque chose de plus profond que ce que vous avez dit à l'origine: c'est juste du sucre syntaxique par lequel le compilateur convertit f(a) en f.apply(a) comme cas de syntaxe spécial.

Cela peut sembler être une règle spécifique, mais seules quelques-unes d'entre elles (par exemple, avec update) permettent DSL - comme des constructions et bibliothèques.

66
oxbow_lakes

C'est en fait l'inverse, un objet ou une classe avec une méthode apply est le cas normal et une fonction est un moyen de construire implicitement un objet du même nom avec une méthode apply. En fait, chaque fonction que vous définissez est un sous-objet de la fonctionn trait (n est le nombre d'arguments).

Reportez-vous à la section 6.6: Applications de fonction de la Spécification du langage Scala pour plus d'informations sur le sujet.

20
sebasgo

Je demande parce qu'il semble que Scala favorise fortement l'application cohérente d'un ensemble de règles plus petit, plutôt que de nombreuses règles avec de nombreuses exceptions.

Oui. Et cette règle appartient à cet ensemble plus petit.

8
Alexey Romanov