scala: отслеживание следствий выбора и других магических кодов
-
10-07-2019 - |
Вопрос
При попытке понять, как работает библиотека, неявные преобразования сбивают с толку. Например, глядя на выражение типа 'val foo: Foo = 1', что превращает 1 в Foo? Р>
Можно ли поручить библиотеке scala (или REPL) распечатывать пути кода, которые выполняются при оценке выражения?
Решение
Вы можете добавить " -Xprint: typer " в командной строке компилятора (или «-Ybrowse: typer» для Swing GUI-браузера), чтобы увидеть код с явно примененными преобразованиями.
Другие советы
В качестве альтернативы распечатке конверсий следует понимать, что последствия не могут просто проявиться неожиданно. Вы должны каким-то образом привести их в сферу. Альтернативы:
<Ол> import
. Не упустите import x.y ._
, когда y
является объектом, поскольку это единственный способ ввести неявное в область видимости. Обратите внимание, что объект scala.Predef
все по умолчанию импортируется в область видимости, то есть, как значения по умолчанию в Scala попадают в область видимости.
scalac -print
печатает код после неявного преобразования типов, где это применимо.
class A{
val x : String = "hi" drop 1
}
Результатом будет
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));
()
}
}
}