Wie wird folgendes kompiliert:
import scala.concurrent.duration._
val time = 20 seconds
Was ist hier eigentlich los?
Es sind ein paar Dinge los.
Erstens erlaubt Scala, dass Punkte und Parens in vielen Methodenaufrufen weggelassen werden, 20 seconds
was 20.seconds()
* entspricht.
Zweitens wird eine "implizite Konvertierung" angewendet. Da 20
es sich um eine Int
und Int
keine seconds
Methode handelt, sucht der Compiler nach einer impliziten Konvertierung, die eine Methode mit einer Methode Int
zurückgibt , wobei die Suche durch den Umfang Ihres Methodenaufrufs eingeschränkt wird.seconds
Sie haben DurationInt in Ihren Bereich importiert . Da DurationInt
es sich um eine implizite Klasse mit einem Int
Parameter handelt, definiert der Konstruktor eine implizite Int => DurationInt
Konvertierung. DurationInt
hat eine seconds
Methode, die alle Suchkriterien erfüllt. Daher schreibt der Compiler Ihren Aufruf als new DurationInt(20).seconds
** neu.
* Ich meine das locker. 20.seconds()
ist tatsächlich ungültig, da die seconds
Methode keine Parameterliste hat und daher die Parens beim Methodenaufruf weggelassen werden müssen .
** Tatsächlich ist dies nicht ganz richtig, da DurationInt
es sich um eine Wertklasse handelt, sodass der Compiler das Umschließen der Ganzzahl nach Möglichkeit vermeidet.
new DurationInt(20).seconds()
solange Sie wissen, wie es geht)seconds
Methode ohne Parens definiert, daher ist das Aufrufen mit Parens ein Fehler.20.seconds()
in Scala schreiben können , nur, dass der Compiler den Aufruf auf diese Weise übersetzt. Es ist erwähnenswert, dass Scala erfordert Sie Pars wegzulassen , wenn das entsprechende Verfahren keine Parameterliste hat, wie in diesem Fall.Die "Magie", die dort vor sich geht, heißt "implizite Konvertierung". Sie importieren die impliziten Konvertierungen, und einige von ihnen übernehmen die Konvertierung zwischen Int (und Double) in Duration. Damit haben Sie es zu tun.
quelle
import scala.concurrent.duration._
das20 seconds
Importieren desDurationConversions
Merkmals jedoch nicht? EDIT : Ich habe gerade festgestellt, was sie tatsächlich importierenDurationInt
. Ich vermute, das liegt daran, dass Sie das eigentliche Merkmal nicht importieren können. Nur eine konkrete Umsetzung des Merkmals?