def conversion scala implicit

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.