在 Intellij Idea 中使用递归函数调试 scala 代码

Debugging scala code with recursive function in Intellij Idea

我有一个琐碎的 class 名为 RecursiveTraversable:

class RecursiveTraversable extends Traversable[Any]{
  override def foreach[U](f: (Any) => U): Unit = {
    recursivePrint(1)
  }

  @tailrec
  private def recursivePrint(counter: Long): Unit = {
    println(s"Test $counter...")
    recursivePrint(counter+1)
  }
}

和一个琐碎的 Main 对象:

object Main {
  def main (args: Array[String]) {
    new RecursiveTraversable().foreach(_ => None)
  }
}

为了调试此代码,我在 RecursiveTraversable 中的 println(s"Test $counter...") 处设置了一个断点,但调试器不会在此时停止。我可以看到 stdout 计数,调试面板上的 this 是 "Collecting data...".

关于我做错了什么以及如何调试此类代码有什么想法吗?

这是一个棘手的问题。原因是调试器在您停止时打印封闭对象的字符串表示形式。在 Traversable 的情况下,它依赖于 foreach,因此当调试器尝试创建该字符串表示形式时,您会得到一个无限循环。

该解决方案需要两个步骤。首先,您覆盖 toString:

class RecursiveTraversable extends Traversable[Any] {
  def foreach[U](f: Any => U): Unit =
    recursivePrint(1)

  override def toString = "Disabled"  // !

  def recursivePrint(counter: Long): Unit = {
    println(s"Test $counter...")
    recursivePrint(counter + 1)
  }
}

object Main {
  def main (args: Array[String]): Unit =
    new RecursiveTraversable().foreach(_ => ())
}

其次,您在“设置”>“调试器”中禁用 "Friendly display of Scala collections in debugger",因为它会绕过 toString