Comment se compile ce qui suit:
import scala.concurrent.duration._
val time = 20 seconds
Que se passe-t-il réellement ici?
Il se passe plusieurs choses.
Premièrement, Scala permet d'omettre les points et les parens dans de nombreux appels de méthode, ce qui 20 seconds
équivaut donc à 20.seconds()
*.
Deuxièmement, une "conversion implicite" est appliquée. Puisque 20
est une méthode Int
et Int
n'a pas de seconds
méthode, le compilateur recherche une conversion implicite qui prend un Int
et retourne quelque chose qui a une seconds
méthode, la recherche étant limitée par la portée de votre appel de méthode.
Vous avez importé DurationInt dans votre scope. Puisque DurationInt
est une classe implicite avec un Int
paramètre, son constructeur définit une Int => DurationInt
conversion implicite . DurationInt
a une seconds
méthode, donc il satisfait tous les critères de recherche. Par conséquent, le compilateur réécrit votre appel en new DurationInt(20).seconds
**.
* Je veux dire cela vaguement. 20.seconds()
n'est en fait pas valide car la seconds
méthode n'a pas de liste de paramètres et par conséquent, les parenthèses doivent être omises lors de l'appel de méthode.
** En fait, ce n'est pas tout à fait vrai car il DurationInt
s'agit d'une classe de valeur, donc le compilateur évitera d'encapsuler l'entier si possible.
new DurationInt(20).seconds()
tant que vous savez comment cela fonctionne)seconds
méthode est définie sans parenthèses, donc l'appeler avec des parenthèses est une erreur.20.seconds()
en Scala, mais seulement que le compilateur traduit l'appel de cette façon. Il est intéressant de noter que Scala vous oblige à omettre les parens si la méthode correspondante n'a pas de liste de paramètres, comme dans ce cas.La "magie" qui se passe là-bas est appelée "conversion implicite". Vous importez les conversions implicites et certaines d'entre elles gèrent la conversion entre Int (et Double) en Duration. C'est de cela que vous avez affaire.
la source
import scala.concurrent.duration._
résolue,20 seconds
mais pas l'importation duDurationConversions
trait? EDIT : Je viens de réaliser ce qu'ils importent réellementDurationInt
. Je suppose que c'est parce que vous ne pouvez pas importer le trait réel? Seule une mise en œuvre concrète du trait?