def - scala implicit conversion
Scala objeto implĂcito vs val implĂcito (1)
He visto dos formas (una menos que la otra) de declarar implicit
para el patrón de clase de tipos en Scala.
implicit val instance1 = new Typeclass { def do = ??? }
implicit object instance2 extends Typeclass { def do = ??? }
¿En qué se diferencian? ¿Debería uno preferirse el uno al otro en ciertos momentos? Encuentro implicit val
mucho más comúnmente usado que el implicit object
y todavía tengo que encontrar muchos recursos sobre el implicit object
.
Una diferencia es que la versión del object
se va a inicializar perezosamente, es decir, su constructor no se llamará hasta la primera vez que se use. Por ejemplo:
trait Incrementer[T] {
def inc(x: T)
}
def increment[T](x: T)(implicit ev: Incrementer[T]) = ev.inc(x)
implicit object IntIncrementer extends Incrementer[Int] {
println("IntIncrementer is being constructed...")
def inc(x: Int) = x + 1
}
implicit val DoubleIncrementer extends Incrementer[Double] {
println("DoubleIncrementer is being constructed...")
def inc(x: Double) = x + 1D
}
Tenga en cuenta que no verá el mensaje de IntIncrementer
hasta que se use, por ejemplo,
increment(1) //this prints "IntIncrementer is being constructed..."
El mensaje de DoubleIncrementer
, sin embargo, se mostrará cuando esté definido. Por lo tanto, la inicialización del implicit object
es perezosa, mientras que la inicialización del valor implicit val
es estricta.