Que signifie exactement ce paramètre de déclaration de méthode:
def myFunc(param: => Int) = param
Quelle est la signification de =>
en définition supérieure?
C'est ce qu'on appelle passe-par-nom . Cela signifie que vous passez une fonction qui devrait retourner Int
mais qui est principalement utilisée pour implémenter l'évaluation paresseuse des paramètres. Il est quelque peu similaire à:
def myFunc(param: () => Int) = param
Voici un exemple. Considérons une fonction answer
retournant une valeur Int
:
def answer = { println("answer"); 40 }
Et deux fonctions, une prenant Int
et une prenant Int
par nom :
def eagerEval(x: Int) = { println("eager"); x; }
def lazyEval(x: => Int) = { println("lazy"); x; }
Exécutez maintenant les deux en utilisant answer
:
eagerEval(answer + 2)
> answer
> eager
lazyEval(answer + 2)
> lazy
> answer
Le premier cas est évident: avant d'appeler eagerEval()
answer
est évalué et affiche la chaîne "answer"
. Le deuxième cas est beaucoup plus intéressant. Nous passons en fait une fonction à lazyEval()
. lazyEval
affiche d'abord "lazy"
Et évalue le paramètre x
(en fait, appelle la fonction x
passée en paramètre).
Juste pour vous assurer qu'il existe une réponse qui utilise le terme approprié: la spécification de langue Scala utilise le terme appel par nom :
Le type d'un paramètre de valeur peut être préfixé par =>, par ex. x: => T. Le type d'un tel paramètre est alors le type de méthode sans paramètre => T. Cela indique que l'argument correspondant n'est pas évalué au point d'application de la fonction, mais est évalué à chaque utilisation dans la fonction. Autrement dit, l'argument est évalué à l'aide de appel par nom .
- Section 4.6.1 de la Spécification du langage Scala
Pour ajouter à la réponse de Tomasz Nurkiewicz ci-dessus, la différence que je rencontre entre () => Int et => Int est que le second permet d'appeler avec des blocs nus:
scala> def myfunc(f : () => Int ) = println("Evaluated: " + f )
myfunc: (f: () => Int)Unit
scala> def myfunc2(f : => Int ) = println("Evaluated: " + f )
myfunc2: (f: => Int)Unit
scala> myfunc({1})
<console>:9: error: type mismatch;
found : Int(1)
required: () => Int
myfunc({1})
^
scala> myfunc2({1})
Evaluated: 1