Comment '20 secondes en Scala?
Comment la compilation suivante:
import scala.concurrent.duration._
val time = 20 seconds
Ce qui se passe réellement ici?
Vous devez vous connecter pour publier un commentaire.
Comment la compilation suivante:
import scala.concurrent.duration._
val time = 20 seconds
Ce qui se passe réellement ici?
Vous devez vous connecter pour publier un commentaire.
Il y a quelques choses qui se passent.
D'abord, Scala permet points et parens être omise de nombreux appels de méthode, de sorte
20 seconds
est équivalent à20.seconds()
*.Deuxième, une "conversion implicite" est appliqué. Depuis
20
est unInt
etInt
n'a pas deseconds
méthode, le compilateur cherche pour une conversion implicite qui prend unInt
et renvoie à quelque chose qui n'ont unseconds
méthode, avec la recherche limitées par la portée de votre appel de méthode.Vous avez importé DurationInt à votre portée. Depuis
DurationInt
est un implicite de la classe avec unInt
paramètre de son constructeur définit implicitementInt => DurationInt
de conversion.DurationInt
a unseconds
méthode, de sorte qu'il remplit tous les critères de recherche. Par conséquent, le compilateur écrit de votre appel, commenew DurationInt(20).seconds
**.*Je l'entends vaguement.
20.seconds()
est en fait pas valide parce que leseconds
méthode n'a pas de liste de paramètres et, par conséquent, les parens doit être omis sur l'appel de la méthode.**En fait, ce n'est pas tout à fait vrai, car
DurationInt
est une classe de valeur, de sorte que le compilateur évitez d'emballer l'entier si possible.new DurationInt(20).seconds()
tant que vous savez comment elle le fait)seconds
méthode est définie sans parens, afin de l'appelant avec des parenthèses est une erreur.20.seconds()
en Scala, seulement que le compilateur est la traduction de l'appeler de cette façon. Il est intéressant de souligner que la Scala il faut, vous pouvez omettre les parenthèses de la méthode n'a pas de liste de paramètres, comme dans ce cas.La "magie" qui se passe, il est appelé "conversion implicite". Vous importez les conversions implicites, et certains d'entre eux de gérer la conversion entre Int (et Double) à la Durée. C'est ce que vous avez à faire.
import scala.concurrent.duration._
résout20 seconds
mais en fait de l'importation de laDurationConversions
Trait ne l'est pas? MODIFIER: Viens de réaliser ce qu'ils sont réellement l'importation estDurationInt
. Je suppose que c'est parce que vous ne pouvez pas importer le réel Trait de caractère? Seule une mise en œuvre concrète du Trait?