¿Cómo funciona ''20 segundos ''en Scala?
duration (2)
¿Cómo se compila la siguiente:
import scala.concurrent.duration._
val time = 20 seconds
¿Qué está pasando realmente aquí?
Hay algunas cosas pasando.
En primer lugar, Scala permite omitir puntos y pares en muchas llamadas a métodos, por lo que 20 seconds
equivalen a 20.seconds()
*.
En segundo lugar, se aplica una "conversión implícita". Como 20
es un método Int
e Int
no tiene seconds
, el compilador busca una conversión implícita que toma un Int
y devuelve algo que tiene un método de seconds
, con la búsqueda restringida por el alcance de su llamada a método.
Has importado DurationInt en tu alcance. Como DurationInt
es una clase implícita con un parámetro Int
, su constructor define una conversión implícita Int => DurationInt
. DurationInt
tiene un método de seconds
, por lo que cumple todos los criterios de búsqueda. Por lo tanto, el compilador reescribe su llamada como new DurationInt(20).seconds
**.
* Quiero decir esto vagamente. 20.seconds()
es válido porque el método de seconds
no tiene una lista de parámetros y, por lo tanto, los paréntesis se deben omitir 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á envolver el entero si es posible.
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 tratando.