我们如何在Scala中跟踪带有行号的表达式/打印语句?

时间:2016-03-24 07:13:13

标签: scala debugging stack-trace trace

如果您想要带行号的打印报表,您是如何做到的?

2 个答案:

答案 0 :(得分:3)

查看Haoyi Li的sourcecode图书馆,我认为它可以为您提供所需内容。

  

sourcecode是一个小型Scala库,提供了常见的“源代码”   代码“运行时程序的上下文,类似于Python   __name__,C ++的__LINE__或Ruby的__FILE__。例如,你可以   询问当前文件的文件名和行号   通过()语法或通过隐式。

参见例如https://github.com/lihaoyi/sourcecode#logging

  

您可以使用sourcecode.File和sourcecode.Line来定义日志   自动捕获其行号和文件名的函数

def log(foo: String)(implicit line: sourcecode.Line, file: sourcecode.File) = {
  println(s"${file.value}:${line.value} $foo")
}

log("Foooooo") // sourcecode/shared/src/test/scala/sourcecode/Tests.scala:86 Fooooo

答案 1 :(得分:2)

这取决于你想做什么。

使用scala-trace-debug库,您可以输入以下内容:

Debug.trace(1 + 2)

得到这个:

"3" in thread main:
    path.to.file(file.Scala: 22) // click-able stack trace

您可以自定义堆栈跟踪的行数,如下所示:

Debug.trace(1 + 2, 3) // 3 lines of stack trace

如果你做info.collaboration_station.debug._,你甚至可以这样做:

val three = 3.trace

...

"3" in thread main:
    path.to.file(file.Scala: 22)

最后,支持表达式:

Debug.traceExpression{
    val myVal = 4
    1 + 2 + myVal
}

...

"{
  val myVal = 4;
  (3).+(myVal)
} -> 7" in thread main:
    at main.Main$.main(Main.scala:12)

与其他库不同,这更适合调试。如果我想提供正在发生的事情的历史记录并且我不希望用户看到堆栈跟踪,我将不会使用此工具。