Я пришел из 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, значение справа будет привязано к значению 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/290632
java -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представления:
