【问题标题】:Alternative to Scala REPL breakIf in 2.10在 2.10 中替代 Scala REPL breakIf
【发布时间】:2012-10-08 00:44:01
【问题描述】:

我正在阅读 here 关于在 REPL 代码中使用 breakIf 方法进行交互式调试的信息,但后来我发现 this postbreakbreakIf 已从 Scala 2.10 中的 ILoop 中删除。不幸的是,该帖子没有解释为什么代码被删除。

我假设这些功能已被删除,因为有更好的方法来执行此操作。如果是这样的话,有人可以赐教吗?

【问题讨论】:

  • 为什么不在 Eclipse 中放置一个断点并让它停在那里,因为你可以给它条件。
  • @James Black - 是的,如果我使用的是 Eclipse,这是一个选项。但是,我真的怀疑这就是为什么从 2.10 代码库中删除此功能的原因。
  • 您可以查看存储库,就像它被删除时一样,看看他们是否输入了一个原因。
  • @James Black - 上面链接的帖子中有一个提交链接。它作为大型提交(影响大量文件)的一部分被删除,提交消息“删除更多不需要的代码”。

标签: scala scala-2.10


【解决方案1】:

也许这个想法是您应该直接使用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 条件(被包装到=> Boolean)和DebugParam/NamedParam(它是临时包装器,仅用于填充 bind 参数)。

此方法还允许您根据需要指定您的Settings。例如,some REPL bugs can be worked around with -Yrepl-sync but break gave you no way of specifying that

【讨论】:

  • 那么答案是他们希望我们自己重新实现它?
  • 好吧,我不能代表 Scala 开发人员。但一个答案可能是它不够灵活,无法按原样使用(例如,如果您需要 -Yrepl-sync),并且使其更灵活会使仅编写代码本身变得复杂。
  • 也就是说,ILoop.settingsILoop.in 的一些更好的默认值会使上面的代码更容易接受。我一点也不担心createInterpreterbindloopcloseInterpreter 调用,因为这些正是我们在这里想要完成的。但是必须在 ILoop 上设置 vars 感觉不对。
  • 最初,当我在 2.10.2 中尝试上述代码时,解释器挂起。它对我有用的是添加repl.settings.Yreplsync.value = true
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多