在 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
。
我有一个琐碎的 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
。