2015-11-08 3 views
1

Я тривиальный класс с именем RecursiveTraversable:Отладка кода с Scala рекурсивной функции в IntelliJ Idea

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, но отладчик не останавливается на этом этапе. Я могу видеть счет stdout и 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 в отладчике" в Настройки> Debugger, как минует toString.

enter image description here

Смежные вопросы