scala: отслеживание следствий выбора и других магических кодов - PullRequest
4 голосов
/ 30 ноября 2009

При попытке понять, как работает библиотека, неявные преобразования сбивают с толку. Например, глядя на выражение типа 'val foo: Foo = 1', что превращает 1 в Foo?

Можно ли поручить библиотеке scala (или REPL) распечатывать пути кода, которые выполняются при оценке выражения?

Ответы [ 3 ]

7 голосов
/ 30 ноября 2009

Вы можете добавить «-Xprint: typer» в командную строку компилятора (или «-Ybrowse: typer» для браузера с графическим интерфейсом Swing), чтобы увидеть код с явно примененными преобразованиями.

3 голосов
/ 30 ноября 2009

В качестве альтернативы распечатке конверсий, нужно понимать, что последствия не могут быть просто неожиданными. Вы должны каким-то образом привести их в сферу. Альтернативы:

  1. Явный import оператор. Следите за import x.y._, когда y является объектом, так как это единственный способ ввести неявное в область действия.
  2. Объект-компаньон класса, который превращается во что-то другое.
  3. Объект-компаньон целевого класса, если эта цель каким-то образом сделана явной (как в вашем примере).

Обратите внимание, что объект scala.Predef по умолчанию импортируется в область видимости, то есть, как значения Scala по умолчанию попадают в область.

0 голосов
/ 30 ноября 2009

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));
      ()
    }
  }
}
...