Réponses:
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 20est une méthode Intet Intn'a pas de secondsméthode, le compilateur recherche une conversion implicite qui prend un Intet retourne quelque chose qui a une secondsméthode, la recherche étant limitée par la portée de votre appel de méthode.
Vous avez importé DurationInt dans votre scope. Puisque DurationIntest une classe implicite avec un Intparamètre, son constructeur définit une Int => DurationIntconversion implicite . DurationInta une secondsmé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 secondsmé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 DurationInts'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)
secondsmé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.
import scala.concurrent.duration._résolue, 20 secondsmais pas l'importation du DurationConversionstrait? EDIT : Je viens de réaliser ce qu'ils importent réellement DurationInt. 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?