Domanda

Qualcuno mi potrebbe spiegare seguente situazione con Scala meccanismo di conversioni implicite. C'è un codice:

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

Questa stampe codice "val". Ma quando io commento seconda linea:

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

stampe codice "def".

Quindi entrambi conversioni implicite (xey) sono possibili in questa situazione. C'è un Non ambiguità regola - una conversione implicita viene inserito solo se non c'è altra possibile conversione da inserire. Secondo questa regola questo codice non deve essere compilato a tutti. Ma il codice viene compilato ed eseguito con successo. Quello che non capisco?

Grazie.

È stato utile?

Soluzione

La ragione di ciò è indicato nella sezione Scala Language Specification 6.26.2.

Prima il metodo può essere trattato come una funzione che deve essere convertito in un eseguendo eta-espansione. Quindi una conversione più implicito dovrebbe essere applicato e quindi la val viene scelto.

Aggiorna : esempio rimosso viziata .

La valutazione di un metodo senza parametri viene sempre eseguita in modo implicito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top