我来自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
来无条件地进入 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)
}
}
}
接着:
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.
你可能需要显式地将主进程的类路径传递给Scalac的设置,但break
和 breakIf
不会这样做。这是一个已修复的break
版本,可以实现此功能:http://gist.github.com/290632 - retronymjava -classpath
内容传递给scalac的设置:http://old.nabble.com/-scala--recent-changes-in-2.8-nightly-classpath-management-td26233977.html - retronymIntelliJ IDEA:
Evaluate Expression
窗口(Alt+F8,在菜单中找到:Run -> Evaluate Expression),以运行任意的 Scala 代码。Eclipse:
从 Scala 2.10 开始,ILoop
中的 break
和 breakIf
已被删除。
要进入解释器,您将需要直接使用 ILoop
。
首先添加 scala 编译器
库。对于 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()
补充一下Daniel的回答,从Scala 2.9版本开始,break
和breakIf
方法包含在scala.tools.nsc.interpreter.ILoop
中。此外,DebugParam
现在是NamedParam
。