2015-11-08 103 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