Я исхожу из фона Python, где в любой точке моего кода я могу добавить
import pdb; pdb.set_trace()
и во время выполнения я попаду в интерактивный интерпретатор на этом месте. Есть ли эквивалент для scala, или это невозможно во время выполнения?
Я исхожу из фона Python, где в любой точке моего кода я могу добавить
import pdb; pdb.set_trace()
и во время выполнения я попаду в интерактивный интерпретатор на этом месте. Есть ли эквивалент для scala, или это невозможно во время выполнения?
Да, вы можете, на 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>
Чтобы добавить к ответам Даниэля, начиная с Scala 2.9, методы break
и breakIf
содержатся в scala.tools.nsc.interpreter.ILoop
. Кроме того, DebugParam
теперь NamedParam
.
IntelliJ IDEA:
Evaluate Expression
(Alt + F8, в меню: Run → Evaluate Expression), чтобы запустить произвольный код Scala.
Eclipse:
По состоянию на 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
: