Scala: Impliziten Auswahl und andere Code Magics impliziert
-
10-07-2019 - |
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?
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:
- Explizit
import
Aussage. Achten Sie aufimport x.y._
Wenny
ist ein Objekt, da dies der einzige Weg ist, um einen impliziten Umfang einzubeziehen. - Der Objektbegleiter der Klasse, der in etwas anderes umgewandelt wird.
- 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));
()
}
}
}