2015-11-08 172 views
1

我有一个简单的类名为RecursiveTraversable调试Scala代码

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) 
    } 
} 

调试代码,我设置一个断点在println(s"Test $counter...")RecursiveTraversable但调试器不停止在这一点上。我可以看到标准输出计数,并在调试面板this是“收集数据...”。

有什么想法我做错了什么,我该如何调试这种类型的代码?

回答

1

这是一个棘手的问题。原因是调试器在停止时打印封闭对象的字符串表示形式。在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(_ =>()) 
} 

第二你在设置>调试器中禁用“在调试Scala集合的友好的显示”,作为绕过toString

enter image description here