scala: le traçage implique la sélection et d'autres magies de code
-
10-07-2019 - |
Question
Lorsque vous essayez de comprendre le fonctionnement d'une bibliothèque, les conversions implicites sont source de confusion. Par exemple, en regardant une expression comme 'val foo: Foo = 1', qu'est-ce qui convertit 1 en Foo?
Est-il possible de demander à la bibliothèque scala (ou REPL) d’imprimer les chemins de code qui s’exécutent lors de l’évaluation d’une expression?
La solution
Vous pouvez ajouter "-Xprint: typer". sur la ligne de commande du compilateur (ou "-Ybrowse: typer" pour un navigateur d'interface graphique pivotante) pour afficher le code avec les conversions explicitement appliquées.
Autres conseils
Au lieu d’imprimer les conversions, il faut comprendre que les implications ne peuvent pas naître du hasard. Vous devez les mettre en œuvre d'une certaine manière. Les alternatives sont:
- Instruction
importation
explicite. Faites attention àimporter x.y ._
lorsquey
est un objet, car il s'agit du seul moyen d'introduire une valeur implicite dans la portée. - L'objet compagnon de la classe en cours de conversion en quelque chose d'autre.
- L'objet compagnon de la classe cible, tant que cette cible est explicite (comme dans votre exemple).
Notez que l'objet scala.Predef
est entièrement importé dans scope par défaut, ce qui correspond aux implications implicites par défaut de Scala.
scalac -print
affiche le code après application des conversions de type implicites.
class A{
val x : String = "hi" drop 1
}
entraînera:
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));
()
}
}
}