我来自Python背景,在我的代码中的任何时候都可以添加
import pdb; pdb.set_trace()
在运行时,我将在那个位置进入交互式解释器。scala是否具有等效功能,或者在运行时无法实现?
我来自Python背景,在我的代码中的任何时候都可以添加
import pdb; pdb.set_trace()
在运行时,我将在那个位置进入交互式解释器。scala是否具有等效功能,或者在运行时无法实现?
Answers:
是的,您可以在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 ,无条件地进入REPL 。这是完整的示例,代码和执行:
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/...
为了增加Daniel的答案,从Scala 2.9开始,break
和breakIf
方法包含在中scala.tools.nsc.interpreter.ILoop
。另外,DebugParam
现在NamedParam
。
IntelliJ IDEA:
Evaluate Expression
(Alt+ F8,在菜单中:运行->评估表达式)窗口以运行任意Scala代码。蚀:
作为斯卡拉2.10两者break
并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
视图使用解释器: