Les différences entre ces trois façons de définir une fonction en Scala

Donné trois façons d'exprimer la même fonction f(a) := a + 1:

val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1

Comment ces définitions diffèrent-ils? Le REPL n'indique pas de différences évidentes:

scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
  • Vous devriez noter que dans le 2e bloc ci-dessus, l'évaluation de f1 dans le REPL montre la valeur statiquement lié à f1 tout en évaluant f2 et f3 montrent le résultat de l'invocation de ces méthodes. En particulier, une nouvelle Function1[Int, Int] instance est produit chaque fois que l' f2 ou f3 est invoquée, alors que f1 est la même Function1[Int, Int] pour toujours.
  • étant donné que le val de version n'a pas besoin d'une nouvelle fonction de l'instance, pourquoi aurait-on jamais utiliser def dans ce cas?
  • La seule situation que je peux me rappeler où l'on voit des defs rendement Fonctionn[...] des valeurs est dans le combinator parser. Ce n'est pas très commun de méthodes d'écriture que le rendement des fonctions et pratiquement jamais ne serait-on utiliser un def de rendement nombre de copies d'un point de vue sémantique / fonctionnellement immuable de la fonction.
InformationsquelleAutor qrest | 2010-09-05