sintaxis que introduccion scala implicit

scala - introduccion - que es jsp



¿Qué son los objetos implícitos? (2)

En Scala, los objetos y los valores se tratan de la misma manera. Se puede pensar en un objeto implícito como un valor que se encuentra en el proceso de buscar un implícito de su tipo.

En su ejemplo, si uno busca de manera implícita una clase de tipo NumberLike con el tipo de parámetro Double o Int , encontrará uno NumberLikeDouble y NumberLikeInt .

implicit object NumberLikeDouble extends NumberLike[Double]

por lo tanto es aproximadamente lo mismo que

implicit val NumberLikeDouble: NumberLike[Double] = new NumberLike[Double] { ...}

o

implicit def NumberLikeDouble: NumberLike[Double] = new NumberLike[Double] { ...}

Al igual que un val , solo hay un valor único de ese tipo y no se necesita la creación de instancias.

Un caso de uso simple:

import Math.NumberLike def sum[A](x: A, y: A)(implicit nl: NumberLike[A]) = nl.plus(x, y) sum(4, 5) // finds NumberLikeInt

Estaba leyendo sobre clases de tipo donde se mencionaban los objetos implícitos:

object Math { trait NumberLike[T] { def plus(x: T, y: T): T def divide(x: T, y: Int): T def minus(x: T, y: T): T } object NumberLike { implicit object NumberLikeDouble extends NumberLike[Double] { def plus(x: Double, y: Double): Double = x + y def divide(x: Double, y: Int): Double = x / y def minus(x: Double, y: Double): Double = x - y } implicit object NumberLikeInt extends NumberLike[Int] { def plus(x: Int, y: Int): Int = x + y def divide(x: Int, y: Int): Int = x / y def minus(x: Int, y: Int): Int = x - y } } }

¿Qué son? ¿Dónde se describen? Solo encontré definición de clases implícitas en la web pero no de objetos implícitos.


Gracias a los objetos implícitos, puedes definir:

def mymethod[T : NumberLike](value: T): T = { implicitly[NumberLike[T]].plus(value, value) }

que le permite llamar a sus métodos en Doble y Flotadores porque tiene objetos para tratar con ellos.

scala> mymethod(1.0) res0: Double = 2.0 scala> mymethod(2) res0: Int = 4 scala> mymethod("test") //Error