139 votes

Comment fonctionne l'expression "20 secondes" en Scala ?

Comment se compile le texte suivant :

import scala.concurrent.duration._

val time = 20 seconds

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

180voto

Aaron Novstrup Points 10742

Il y a plusieurs choses qui se passent.

Tout d'abord, Scala permet d'omettre les points et les parenthèses dans de nombreux appels de méthodes, ainsi 20 seconds est équivalent à 20.seconds() *.

Deuxièmement, une "conversion implicite" est appliquée. Puisque 20 est un Int y Int n'a pas seconds le compilateur recherche une conversion implicite qui prend une méthode Int et renvoie quelque chose qui a a seconds la recherche étant limitée par la portée de votre appel de méthode.

Vous avez importé DuréeInt dans votre lunette. Depuis DurationInt est une classe implicite avec un Int son constructeur définit un paramètre implicite Int => DurationInt conversion. DurationInt a un seconds de sorte qu'il satisfait à tous les critères de recherche. Par conséquent, le compilateur réécrit votre appel en tant que new DurationInt(20).seconds **.

*Je dis ça au sens large. 20.seconds() est en fait invalide parce que le seconds n'a pas de liste de paramètres et donc les parenthèses doit être omise lors de l'appel de la méthode.

**En fait, ce n'est pas tout à fait vrai car DurationInt est une classe de valeurs, donc le compilateur évitera d'envelopper l'entier si possible.

7voto

Bruno Reis Points 16132

La "magie" qui s'opère ici est appelée "conversion implicite". Vous importez les conversions implicites, et certaines d'entre elles gèrent la conversion de Int (et Double) en Duration. C'est de cela qu'il s'agit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X