Pregunta

Podría alguien explicar siguiente situación con Scala mecanismo de conversiones implícitas. Hay un código:

object Main {
  implicit val x:Int => String = v => "val"
  implicit def y(v:Int) = "def"

  def p(s:String) = print(s)

  def main(args: Array[String]): Unit = {
      p(1)
  }
}

Este código imprime "val". Pero cuando comento segunda línea:

//implicit val x:Int => String = v => "val"

código imprime "def".

Así son posibles las dos conversiones implícitas (x e y) en esta situación. Hay un No-La ambigüedad Regla - una conversión implícita solamente se inserta si no hay otra posible conversión a insertar. De acuerdo con esta regla, este código no debe ser compilado en absoluto. Sin embargo, el código se compila y se ejecuta correctamente. Lo que no entiendo?

Gracias.

¿Fue útil?

Solución

La razón de esto se afirma en la sección Especificación del lenguaje Scala 6.26.2.

Antes de que el método puede ser tratada como una función que tiene que ser convertido en uno mediante la realización de eta-expansión. Por lo tanto una conversión más implícita tendría que ser aplicado y así se elige el val.

Actualizar : eliminado ejemplo viciado

.

Evaluación de un método sin parámetros se realiza siempre de forma implícita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top