在任意scala代码位置期间进入解释器

时间:2010-01-29 06:46:40

标签: debugging scala interpreter

我来自Python背景,在我的代码中的任何一点我都可以添加

import pdb; pdb.set_trace()

并且在运行时我将被放入该位置的交互式解释器中。是否有scala的等价物,或者这在运行时是不可能的?

3 个答案:

答案 0 :(得分:76)

是的,你可以,在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无条件地进入REPL,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) } } } 而不是vararg。这是一个完整的例子,代码和执行:

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>

然后:

{{1}}

答案 1 :(得分:24)

要添加到Daniel的答案,从Scala 2.9开始,breakbreakIf方法包含在scala.tools.nsc.interpreter.ILoop中。另外,DebugParam现在是NamedParam

答案 2 :(得分:24)

IntelliJ IDEA:

  1. 以调试模式运行或附加远程调试器
  2. 设置断点并一直运行直至找到它
  3. 打开Evaluate Expression Alt + F8 ,在菜单中:运行 - &gt;评估表达式)窗口以运行任意Scala代码。
  4. 键入要运行的代码片段或表达式,然后单击“评估”
  5. 键入 Alt + V 或单击“评估”以运行代码片段。
  6. <强>蚀:

    自Scala 2.10起,breakbreakIf已从ILoop移除。

    要闯入口译员,您必须直接与ILoop合作。

    首先添加scala compiler库。对于Eclipse Scala,右键单击project =&gt; Build Path =&gt; Add Libraries... =&gt; 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视图中使用解释器: