Comment fonctionne «20 secondes» dans Scala?

Comment le comstack suivant:

import scala.concurrent.duration._ val time = 20 seconds 

Qu’est-ce qui se passe réellement ici?

Il y a quelques petites choses qui se passent.

Tout d’abord, Scala permet d’omettre les points et les parens de nombreux appels de méthode, donc 20 seconds équivalent à 20 seconds 20.seconds() *.

Deuxièmement, une “conversion implicite” est appliquée. Comme 20 est une méthode Int et Int sans méthode seconds , le compilateur recherche une conversion implicite qui prend un Int et retourne quelque chose qui a une méthode seconds , avec la recherche limitée par la scope de votre appel de méthode.

Vous avez importé DurationInt dans votre scope. Puisque DurationInt est une classe implicite avec un paramètre Int , son constructeur définit une conversion Int => DurationInt implicite. DurationInt a une méthode seconds , donc il répond à tous les critères de recherche. Par conséquent, le compilateur réécrit votre appel en tant que new DurationInt(20).seconds **.

* Je veux dire ça 20.seconds() n’est pas valide car la méthode seconds n’a pas de liste de parameters et les parens doivent donc être omis lors de l’appel de méthode.

** En fait, ce n’est pas tout à fait vrai parce que DurationInt est une classe de valeur, donc le compilateur évitera d’envelopper l’entier si possible.

La “magie” qui s’y passe s’appelle “conversion implicite”. Vous importez les conversions implicites et certaines d’entre elles gèrent la conversion entre Int (et Double) en Durée. C’est ce que vous traitez.