Я пришел из Python, где в любой момент своего кода я могу добавить
import pdb; pdb.set_trace()
и во время выполнения я попаду в интерактивный интерпретатор в этом месте. Есть ли эквивалент для scala или это невозможно во время выполнения?
debugging
scala
interpreter
Ларс Йенкен
источник
источник
Ответы:
Да, в 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, значение справа будет привязано к значению val, имя которого вы указали слева. Например, если я изменю эту строку следующим образом: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
.Вы также можете безоговорочно упасть в РЕПЛ Вызывая
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.tools.nsc.MissingRequirementError: object scala not found.
в Scala 2.8. Возможно , вам потребуется явно передать путь к классам хост - процесса в Настройках Scalac, ноbreak
иbreakIf
не делать этого. Вот исправленная версия ,break
что делает: gist.github.com/290632java -classpath ...
. Я думаю, если вы используетеscala -classpath
вместо этого, он будет работать нормально.java -classpath
процесса пребывания в настройках для scalac: old.nabble.com/...Для того, чтобы добавить к ответу Даниила, как и в Scala 2.9, то
break
иbreakIf
методы содержатся вscala.tools.nsc.interpreter.ILoop
. ТакжеDebugParam
сейчасNamedParam
.источник
IntelliJ IDEA:
Evaluate Expression
( Alt+ F8, в меню: Run -> Evaluate Expression) окно для запуска произвольного кода Scala.Затмение:
Начиная с 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
представления:источник