scala: отслеживание следствий выбора и других магических кодов

StackOverflow https://stackoverflow.com/questions/1818181

  •  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));
          ()
        }
      }
    }
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top