Frage

Könnte mir jemand folgende Situation mit Scala impliziten Konvertierungen Mechanismus erklären. Es gibt einen 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)
  }
}

Dieser Code druckt "val". Aber wenn ich zweite Zeile Kommentar:

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

Code druckt "def".

So beide impliziten Konvertierungen (x und y) in dieser Situation möglich sind. Es gibt eine Nicht-Zweideutigkeit - eine implizite Konvertierung nur eingeführt wird, wenn es keine andere mögliche Umwandlung ist einzufügen. Nach dieser Regel soll dieser Code überhaupt nicht kompiliert werden. Aber der Code erfolgreich kompiliert und ausgeführt. Was verstehe ich nicht?

Danke.

War es hilfreich?

Lösung

The reason for this is stated in the Scala Language Specification section 6.26.2.

Before the method can be treated as a function it needs to be converted to one by performing eta-expansion. Thus one more implicit conversion would have to be applied and so the val is chosen.

UPDATE: removed flawed example.

Evaluation of a method without parameters is always performed implicitly.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top