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

Intellij Idea中使用递归函数调试scala代码,scala,debugging,intellij-idea,tail-recursion,Scala,Debugging,Intellij Idea,Tail Recursion,我有一个名为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

我有一个名为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…”)设置了一个断点。我可以在调试面板上看到标准输出计数和
这个
是“收集数据…”


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

这是一个棘手的问题。原因是当您停止时,调试器会打印封闭对象的字符串表示形式。在
可遍历
的情况下,它依赖于
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(_ => ())
}
其次,在“设置”>“调试器”中禁用“调试器中Scala集合的友好显示”,因为这会绕过
toString