Question

Quelqu'un pourrait me expliquer la situation suivante avec le mécanisme des conversions implicites Scala. Il y a un code:

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)
  }
}

Ce code imprime "val". Mais quand je commente la deuxième ligne:

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

code affiche "def".

Alors les conversions implicites (x et y) sont possibles dans cette situation. Il y a une Règle non-Ambiguïté - une conversion implicite n'est insérée s'il n'y a pas d'autre conversion possible d'insérer. Selon cette règle ce code ne doit pas être compilé du tout. Mais le code est compilé avec succès et exécuté. Ce que je ne comprends pas?

Merci.

Était-ce utile?

La solution

La raison de cela est indiqué dans la section Scala spécification du langage 6.26.2.

Avant le procédé peut être traitée comme une fonction, il doit être converti en une en effectuant eta-expansion. Ainsi, une conversion plus implicite aurait à appliquer et donc le val est choisi.

UPDATE : par exemple imparfait enlevé

.

L'évaluation d'une méthode sans paramètres est toujours effectuée implicitement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top