Scala: rastrear a seleção de implícitos e outras mágicas de código
-
10-07-2019 - |
Pergunta
Ao tentar descobrir como uma biblioteca funciona, conversões implícitas são confusas. Por exemplo, olhando para uma expressão como 'Val Foo: Foo = 1', o que converte 1 em foo?
É possível instruir a Biblioteca Scala (ou REPL) a imprimir os caminhos de código que estão executando ao avaliar uma expressão?
Solução
Você pode adicionar "-xprint: typer" à linha de comando do compilador (ou "-ybrowse: typer" para um navegador GUI swing) para ver o código com as conversões aplicadas explicitamente.
Outras dicas
Como alternativa para imprimir as conversões, é preciso perceber que os implícitos não podem simplesmente sair do nada. Você tem que trazê -los para o escopo de alguma forma. As alternativas são:
- Explícito
import
declaração. Ter cuidado comimport x.y._
quandoy
é um objeto, pois essa é a única maneira de trazer um implícito no escopo. - O companheiro de objeto da classe que está sendo convertido em outra coisa.
- O companheiro de objeto da classe de destino, desde que esse alvo seja explicitado de alguma forma (como no seu exemplo).
Observe que o objeto scala.Predef
é tudo importado para o escopo por padrão, e é assim que os implícitos padrão de Scala entram no escopo.
scalac -print
Imprime o código após conversões de tipo implícito, quando aplicado.
class A{
val x : String = "hi" drop 1
}
Vai resultar em:
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));
()
}
}
}