Pregunta

Al intentar calcular cómo funciona una biblioteca, las conversiones implícitas son confusas. Por ejemplo, mirando una expresión como 'val foo: Foo = 1', ¿qué convierte 1 a Foo?

¿Es posible indicarle a la biblioteca scala (o REPL) que imprima las rutas de código que se están ejecutando mientras se evalúa una expresión?

¿Fue útil?

Solución

Puede agregar " -Xprint: typer " a la línea de comandos del compilador (o '' -Ybrowse: typer '' para un navegador GUI de swing) para ver el código con las conversiones aplicadas explícitamente.

Otros consejos

Como alternativa a imprimir las conversiones, uno debe darse cuenta de que las implicidades no pueden salir de la nada. Tienes que ponerlos dentro del alcance de alguna manera. Las alternativas son:

    Declaración
  1. explícita import . Tenga cuidado con import x.y._ cuando y es un objeto, ya que esta es la única forma de incorporar un alcance implícito.
  2. El objeto compañero de la clase que se está convirtiendo en otra cosa.
  3. El compañero de objeto de la clase objetivo, siempre y cuando ese objetivo se haga explícito de alguna manera (como en su ejemplo).

Tenga en cuenta que el objeto scala.Predef se importa al ámbito de forma predeterminada, que es la forma en que las implicaciones predeterminadas de Scala entran en el ámbito.

scalac -print imprime el código después de las conversiones de tipo implícito donde se aplica.

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

resultará en:

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));
      ()
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top