在任意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开始, break
和breakIf
方法包含在scala.tools.nsc.interpreter.ILoop
。 此外, DebugParam
现在是NamedParam
。
IntelliJ IDEA:
- 以debugging模式运行或附加远程debugging器
- 设置一个断点并运行,直到达到它
- 打开
Evaluate Expression
( Alt + F8 ,在菜单:运行 – >评估expression式)窗口运行任意的Scala代码。 - input您要运行的代码片段或expression式,然后单击“评估”
- 键入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
视图中使用: