¿Cómo se compila lo siguiente:
import scala.concurrent.duration._
val time = 20 seconds
¿Qué está pasando realmente aquí?
Están sucediendo algunas cosas.
Primero, Scala permite que se omitan puntos y parens de muchas llamadas a métodos, por lo que 20 secondses equivalente a 20.seconds()*.
En segundo lugar, se aplica una "conversión implícita". Dado que 20es un método Inty Intno tiene ningún secondsmétodo, el compilador busca una conversión implícita que tome Inty devuelva algo que sí tiene un secondsmétodo, con la búsqueda limitada por el alcance de la llamada al método.
Ha importado DurationInt a su alcance. Como DurationIntes una clase implícita con un Intparámetro, su constructor define una Int => DurationIntconversión implícita . DurationInttiene un secondsmétodo, por lo que satisface todos los criterios de búsqueda. Por lo tanto, el compilador reescribe su llamada como new DurationInt(20).seconds**.
* Me refiero a esto libremente. 20.seconds()en realidad no es válido porque el secondsmétodo no tiene una lista de parámetros y, por lo tanto, los parens deben omitirse en la llamada al método.
** En realidad, esto no es del todo cierto porque DurationIntes una clase de valor, por lo que el compilador evitará ajustar el entero si es posible.
new DurationInt(20).seconds()siempre que sepas cómo lo hace)secondsmétodo se define sin parens, por lo que llamarlo con parens es un error.20.seconds()en Scala, solo que el compilador está traduciendo la llamada de esa manera. Vale la pena señalar que Scala requiere que omita parens si el método correspondiente no tiene una lista de parámetros, como en este caso.La "magia" que está sucediendo allí se llama "conversión implícita". Está importando las conversiones implícitas, y algunas de ellas manejan la conversión entre Int (y Double) a Duration. Eso es con lo que estás lidiando.
fuente
import scala.concurrent.duration._resuelve20 secondspero en realidad la importación delDurationConversionsRasgo no? EDITAR : Acabo de darme cuenta de lo que realmente están importandoDurationInt. Supongo que esto se debe a que no puedes importar el Rasgo real. ¿Solo una implementación concreta del rasgo?