Scala是否准备好使用“宏”定义 - 比如LINE,FILE?

时间:2011-12-14 20:05:29

标签: scala macros

当您从异常中获得堆栈跟踪时,您将获得文件和行号。我的报告需要这样的东西,所以我可以非常快地找到原因。

我特别关注LINE和FILE宏。 Scala中有这样的东西吗?

3 个答案:

答案 0 :(得分:6)

Scala和Java中都没有这样的宏。当然,行号信息存储在字节码中(也用于调试目的),但没有API可以获取它。

具有类名和行号的堆栈跟踪是通过本机Throwable.fillInStackTrace()生成的。记录库也可能使用Thread.getStackTrace()

在这两种情况下,它归结为解析堆栈跟踪并找到我们当前的位置。请注意,生成堆栈跟踪非常耗时,应该避免使用。

答案 1 :(得分:2)

sourcecode库基于宏,并在编译时提供元数据。

示例(取自他们的页面):

object Main extends App {
  def log(message: String)(implicit line: sourcecode.Line, file: sourcecode.File) = 
    println(s"${file.value}:${line.value} $message")

  log("foo")
}

这将打印:

  

/Users/jhoffmann/Development/sourcecode/src/main/scala/Main.scala:5 foo

您可以在代码中的任何位置使用隐含。

答案 2 :(得分:1)

这是一个在Scala中提供宏功能的项目。

也许您可以与项目团队联系,讨论您的需求