Заходите в интерпретатор при произвольном расположении скала-кода - PullRequest
81 голосов
/ 29 января 2010

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

import pdb; pdb.set_trace()

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

Ответы [ 3 ]

76 голосов
/ 29 января 2010

Да, вы можете, на Scala 2.8. Обратите внимание, что для этого вам нужно включить scala-compiler.jar в ваш путь к классам. Если вы вызываете вашу программу 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 вместо vararg. Вот полный пример, код и выполнение:

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>
24 голосов
/ 28 сентября 2013

IntelliJ IDEA:

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

Затмение:

Начиная с версии Scala 2.10, break и breakIf удалены из ILoop.

Чтобы войти в интерпретатор, вам придется работать с ILoop напрямую.

Сначала добавьте scala compiler библиотеку. Для Eclipse Scala щелкните правой кнопкой мыши проект => 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:

24 голосов
/ 16 июня 2011

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

...