Scala REPL 2.10 中 breakIf 的替代方案

35
我正在阅读这里关于在REPL代码中使用breakIf方法进行交互式调试,但后来我发现这篇文章ILoop中的breakbreakIf已在Scala 2.10中被删除。不幸的是,那篇文章没有解释为什么要删除这段代码。
我猜想这些函数被移除是因为有更好的方法来实现这个功能。如果是这样,请有人给我指点一下吗?

为什么不在Eclipse中设置断点并停止程序,因为您可以给它设置条件。 - James Black
@James Black - 是的,如果我使用Eclipse,那是一个选项。然而,我真的怀疑这就是为什么这个功能从2.10代码库中删除的原因。 - DaoWen
你可以查看代码库,看看它被移除的原因是否有注释。 - James Black
1
@James Black - 在上面链接的帖子中有一个提交链接。它是作为一个大提交的一部分被删除的(影响了许多文件),提交消息为“删除更多不必要的代码”。 - DaoWen
1个回答

6
也许可以直接使用ILoop工作?据我所知,这并不比以下操作复杂:
// insert the code below wherever you want a REPL
val repl = new ILoop
repl.settings = new Settings
repl.in = SimpleReader()
repl.createInterpreter()

// bind any local variables that you want to have access to
repl.intp.bind("i", "Int", i)
repl.intp.bind("e", "Exception", e)

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

与旧的 breakIf API 相比,这种方法消除了对两个级别的间接性,即对 if 条件(其被包装为 => 布尔值)和 DebugParam/NamedParam (它们是临时包装器,仅用于填充 bind 参数)。

这种方法还允许您根据需要指定您的 Settings。例如,一些 REPL 错误可以通过 -Yrepl-sync 解决,但 break 并没有提供指定该选项的方式


1
所以答案是他们希望我们自己重新实现它? - DaoWen
嗯,我不能代表Scala开发人员说话。但一个答案可能是它不够灵活,不能直接使用(例如,如果你需要“-Yrepl-sync”),而使其更加灵活会使编写代码本身变得复杂。 - Steve
1
话虽如此,为 ILoop.settingsILoop.in 设置一些更好的默认值将使上述代码更加易读。我对 createInterpreterbindloopcloseInterpreter 的调用并不感到困扰,因为这正是我们想要实现的。但是,在 ILoop 上设置变量似乎不太合适。 - Steve
1
最初,当我在2.10.2中尝试上述代码时,解释器挂起了。让它为我工作的是添加 repl.settings.Yreplsync.value = true - Ben Hutchison

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