Зайти в переводчик в произвольное место кода на Scala



Я пришел из мира Python, где в любой момент в моем коде я могу добавить



import pdb; pdb.set_trace()


и во время выполнения я буду брошен в интерактивный интерпретатор в этом месте. Есть ли эквивалент для scala, или это невозможно во время выполнения?

566   3  

3 ответов:

Да, вы можете, на Scala 2.8. Обратите внимание, что для этого вам нужно включить Scala-компилятор.jar в вашем classpath. Если вы вызываете свою программу scala с помощью scala, это будет сделано автоматически (или так кажется в тестах я сделал).

затем вы можете использовать его как это:

import scala.tools.nsc.Interpreter._

object TestDebugger {
  def main(args: Array[String]) {
    0 to 10 foreach { i =>
      breakIf(i == 5, DebugParam("i", i))
      println(i)
    }
  }
}

вы можете пройти несколько DebugParam аргументов. Когда REPL появляется, значение справа будет привязано к валу, имя которого вы указали слева. Например, если я измените эту строку следующим образом:

      breakIf(i == 5, DebugParam("j", i))

тогда исполнение будет происходить следующим образом:

C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger
0
1
2
3
4
j: Int

scala> j
res0: Int = 5

вы продолжаете выполнение, набрав :quit.

вы также можете безоговорочно перейти в REPL, вызвав break, получает List на DebugParam вместо с переменным числом аргументов. Вот полный пример, код и выполнение:

import scala.tools.nsc.Interpreter._

object TestDebugger {
  def main(args: Array[String]) {
    0 to 10 foreach { i =>
      breakIf(i == 5, DebugParam("j", i))
      println(i)
      if (i == 7) break(Nil)
    }
  }
}

и затем:

C:\Users\Daniel\Documents\Scala\Programas>scalac TestDebugger.scala

C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger
0
1
2
3
4
j: Int

scala> j
res0: Int = 5

scala> :quit
5
6
7

scala> j
<console>:5: error: not found: value j
       j
       ^

scala> :quit
8
9
10

C:\Users\Daniel\Documents\Scala\Programas>

чтобы добавить к ответу Даниэля, начиная со Scala 2.9,break и breakIf методы, содержащиеся в scala.tools.nsc.interpreter.ILoop. Кроме того,DebugParam Теперь NamedParam.

IntelliJ идея:

  1. запуск в режиме отладки или подключение удаленного отладчика
  2. установите точку останова и бегите, пока не достигнете ее
  3. открыть Evaluate Expression ( Alt+F8 в меню: Run -> проверить выражение) окно для запуска произвольного кода на Scala.
  4. введите фрагмент кода или выражение, которое вы хотите запустить, и нажмите кнопку Оценить
  5. тип Alt+V или нажмите кнопку на вычислить, чтобы запустить фрагмент кода.

затмение:

по состоянию на Scala 2.10 оба break и breakIf были удалены ILoop.

для взлома интерпретатора вам придется работать с ILoop напрямую.

добавить scala compiler библиотека. Для Eclipse Scala щелкните правой кнопкой мыши на project =>Build Path=>Add Libraries...=>Scala Compiler.

и тогда вы можете использовать следующее, Где вы хотите запустить интерпретатор:

import scala.tools.nsc.interpreter.ILoop
import scala.tools.nsc.interpreter.SimpleReader
import scala.tools.nsc.Settings

val repl = new ILoop
repl.settings = new Settings
repl.settings.Yreplsync.value = true
repl.in = SimpleReader()
repl.createInterpreter()

// bind any local variables that you want to have access to
repl.intp.bind("row", "Int", row)
repl.intp.bind("col", "Int", col)

// start the interpreter and then close it after you :quit
repl.loop()
repl.closeInterpreter()

в Eclipse Scala интерпретатор может быть использован из Console view:

Comments

    Ничего не найдено.