¿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 seconds
es equivalente a 20.seconds()
*.
En segundo lugar, se aplica una "conversión implícita". Dado que 20
es un método Int
y Int
no tiene ningún seconds
método, el compilador busca una conversión implícita que tome Int
y devuelva algo que sí tiene un seconds
método, con la búsqueda limitada por el alcance de la llamada al método.
Ha importado DurationInt a su alcance. Como DurationInt
es una clase implícita con un Int
parámetro, su constructor define una Int => DurationInt
conversión implícita . DurationInt
tiene un seconds
mé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 seconds
mé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 DurationInt
es 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)seconds
mé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 seconds
pero en realidad la importación delDurationConversions
Rasgo 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?