web-dev-qa-db-fra.com

Comment fonctionne '20 secondes' en Scala?

Comment les éléments suivants sont-ils compilés:

import scala.concurrent.duration._

val time = 20 seconds

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

123
ripper234

Il y a quelques choses qui se passent.

Premièrement, Scala permet aux points et aux parenthèses d'être omis de nombreux appels de méthode, de sorte que 20 seconds Équivaut à 20.seconds() *.

Deuxièmement, une "conversion implicite" est appliquée. Puisque 20 Est une méthode Int et que Int ne possède pas de méthode seconds, le compilateur recherche une conversion implicite prenant un Int et renvoie quelque chose qui a une méthode seconds, la recherche étant contrainte 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 paramètre Int, son constructeur définit une conversion implicite Int => DurationInt. DurationInt a une méthode seconds et satisfait donc 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 cela vaguement. 20.seconds() est en réalité invalide car la méthode seconds ne contient aucune liste de paramètres et par conséquent les parenthèses doivent être omis appel de méthode.

** En réalité, ce n'est pas tout à fait vrai parce que DurationInt est une classe de valeur, aussi le compilateur évitera-t-il, si possible, d'emballer le entier.

160
Aaron Novstrup

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 avez à faire.

7
Bruno Reis