在任意scala代码位置放入解释器

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

import pdb; pdb.set_trace() 

在运行时,我将被放入该交互式解释器。 是否有一个等价的Scala,或者这是不可能在运行时?

是的,你可以在Scala 2.8上。 请注意,为此,您必须在您的类path中包含scala-compiler.jar。 如果你用scala调用你的Scala程序,它将自动完成(或者在我做的testing中似乎是这样)。

你可以像这样使用它:

 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 

通过input:quit继续执行。

您也可以通过调用break无条件地放入REPL,它接收一个DebugParam List而不是一个可变参数。 这是一个完整的例子,代码和执行:

 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> 

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

IntelliJ IDEA:

  1. 以debugging模式运行或附加远程debugging器
  2. 设置一个断点并运行,直到达到它
  3. 打开Evaluate ExpressionAlt + F8 ,在菜单:运行 – >评估expression式)窗口运行任意的Scala代码。
  4. input您要运行的代码片段或expression式,然后单击“评估”
  5. 键入Alt + V或点击Evaluate运行代码片段。

蚀:

从Scala 2.10开始, breakIf已经从ILoop删除了,

闯入解释器,你将不得不直接使用ILoop

首先添加scala compiler库。 对于Eclipse Scala,右键单击project => 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视图中使用: