Frage

Wenn Sie versuchen, festzustellen, wie eine Bibliothek funktioniert, sind implizite Conversions verwirrend. Was konvertiert beispielsweise einen Ausdruck wie 'Val Foo: Foo = 1', was 1 in Foo umwandelt?

Ist es möglich, die Scala -Bibliothek (oder Repl) zu unterweisen, die Codepfade auszudrucken, die ausgeführt werden, während ein Ausdruck bewertet wird?

War es hilfreich?

Lösung

Sie können "-xprint: typer" zur Befehlszeile (oder "-ybrowse: typer" für einen Swing-GUI-Browser hinzufügen, um den Code mit den Konvertierungen ausdrücklich anzuzeigen.

Andere Tipps

Als Alternative zum Ausdruck der Konvertierungen muss man erkennen, dass Implicits nicht einfach aus heiterem Himmel kommen können. Sie müssen sie in irgendeiner Weise in den Bereich bringen. Die Alternativen sind:

  1. Explizit import Aussage. Achten Sie auf import x.y._ Wenn y ist ein Objekt, da dies der einzige Weg ist, um einen impliziten Umfang einzubeziehen.
  2. Der Objektbegleiter der Klasse, der in etwas anderes umgewandelt wird.
  3. Der Objektbegleiter der Zielklasse, solange dieses Ziel irgendwie explizit gemacht wird (wie in Ihrem Beispiel).

Beachten Sie, dass das Objekt scala.Predef ist standardmäßig in den Geltungsbereich importiert, so wie Scalas Standard -Implizits in den Geltungsbereich geraten.

scalac -print Druckt den Code nach impliziten Typkonvertierungen, bei denen angewendet wird.

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

Wird darin enden, dass:

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));
      ()
    }
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top