Intellij Idea中使用递归函数调试scala代码
我有一个名为RecursiveTraversable的普通类: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
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