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?

Était-ce utile?

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:

  1. Instruction importation explicite. Faites attention à importer x.y ._ lorsque y est un objet, car il s'agit du seul moyen d'introduire une valeur implicite dans la portée.
  2. L'objet compagnon de la classe en cours de conversion en quelque chose d'autre.
  3. 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));
      ()
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top