如何编写Scala 2.9代码以允许进入解释器

13
我不确定如何编写代码,以允许在Scala 2.9代码中插入解释器。这个问题是这个问题的后续,该问题询问了以下内容的Scala等效方式:
import pdb
pdb.set_trace()

这段代码是关于Python的。原帖中给出的建议主要是针对Scala 2.8的,相关的包已不再以原来的形式存在。具体而言:

  1. scala.nsc.tools.nsc.Interpreter.{break, breakIf}已移至scala.nsc.tools.nsc.interpreter.ILoop.{break, breakIf}
  2. DebugParam现在在scala.tools.nsc.interpreter中被称为NamedParam

正如原帖所述,父进程的类路径不会自动传递到新的解释器中,因此提供了一种解决方法here。不幸的是,许多在那里调用的类/方法现在已经发生了变化,我不太确定如何修改代码以使其按照“预期”的方式运行。

谢谢!

编辑:这是我的测试代码,目前可以编译和运行,但如果使用scalac编译并由scala执行,则尝试在调试器中执行任何内容都会导致应用程序冻结。

import scala.tools.nsc.interpreter.ILoop._

object Main extends App {

  case class C(a: Int, b: Double, c: String) {
    def throwAFit(): Unit = {
      println("But I don't wanna!!!")
    }
  }

  // main
  override def main(args: Array[String]): Unit = {

    val c = C(1, 2.0, "davis")

    0.until(10).foreach {
      i => 
        println("i = " + i)
        breakIf(i == 5)
    }
  }
}

EDIT2: 由于我的当前设置是通过sbt运行的,我发现这个主题在常见问题解答中有在页面底部涉及。然而,我不理解给出的解释,并且任何关于MyType的澄清都将是宝贵的。
EDIT3: 另一个讨论该主题但没有解决方案:http://permalink.gmane.org/gmane.comp.lang.scala.simple-build-tool/1622

今晚我也遇到了这个问题。即使是:object Main extends App { scala.tools.nsc.interpreter.ILoop.breakIf(true) } 也会挂起。 - arya
1个回答

3

我知道这是一个老问题,但如果你的REPL挂起了,我想知道问题是否是因为你需要提供-Yrepl-sync选项?当我的嵌入式REPL在类似情况下挂起时,这对我解决了问题。

要在嵌入式REPL中设置-Yrepl-sync,而不是使用breakIf,你需要直接使用ILoop工作,这样你就可以访问Settings对象:

// create the ILoop
val repl = new ILoop
repl.settings = new Settings
repl.in = SimpleReader()

// set the "-Yrepl-sync" option
repl.settings.Yreplsync.value = true

// start the interpreter and then close it after you :quit
repl.createInterpreter()
repl.loop()
repl.closeInterpreter()

这个解决方案确实对我有用,可以解决OP遇到的问题。你甚至可以按照这种方式编写自己的 breakbreakIf - r.v

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接