Domanda

Quando si cerca di capire come funziona una libreria, le conversioni implicite creano confusione. Ad esempio, guardando un'espressione come 'val foo: Foo = 1', cosa converte 1 in Foo?

È possibile istruire la libreria di scale (o REPL) a stampare i percorsi del codice che vengono eseguiti durante la valutazione di un'espressione?

È stato utile?

Soluzione

Puoi aggiungere " -Xprint: typer " alla riga di comando del compilatore (o " -Ybrowse: typer " per un browser con GUI swing) per vedere il codice con le conversioni esplicitamente applicate.

Altri suggerimenti

In alternativa alla stampa delle conversioni, bisogna rendersi conto che le implicazioni non possono semplicemente uscire dal nulla. Devi metterli in campo di applicazione in qualche modo. Le alternative sono:

  1. Dichiarazione import esplicita. Fai attenzione a import x.y._ quando y è un oggetto, poiché questo è l'unico modo per introdurre un ambito implicito.
  2. Il compagno oggetto della classe che viene convertito in qualcos'altro.
  3. Il compagno oggetto della classe target, purché tale obiettivo sia reso esplicito in qualche modo (come nel tuo esempio).

Nota che l'oggetto scala.Predef è tutto importato nell'ambito nell'ambito di default, ed è così che entrano in campo gli impliciti di default di Scala.

scalac -print stampa il codice dopo conversioni di tipo implicito ove applicato.

class A{
    val x : String = "hi" drop 1 
}

Si tradurrà in:

package <empty> {
  class A extends java.lang.Object with ScalaObject {
    @remote def $tag(): Int = scala.ScalaObject$class.$tag(A.this);
    private[this] val x: java.lang.String = _;
    <stable> <accessor> def x(): java.lang.String = A.this.x;
    def this(): A = {
      A.super.this();
      A.this.x = scala.this.Predef.forceRandomAccessCharSeq(
        scala.this.Predef.stringWrapper("hi").drop(1));
      ()
    }
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top