scala - 从 scala 宏的上下文中获取资源路径文件

标签 scala scala-macros scala-2.11

我想制作一个宏,在编译时验证其他项目中资源的存在。是否可以从上下文中获取此信息?

  def example_impl(c: Context): c.Expr[Unit] = {
    import c.universe._
    //instead of  
    // val r = this.getClass().getResource("/file.txt")

    val r = c.somthing.getResource("/file.txt")
    //...
  }

这也许是不可能的。但如果是的话,我想知道该怎么做。

最佳答案

我们首先考虑什么是“资源”。资源是可以从类路径中的目录开始找到的文件。请注意,为此目的,jar 文件是一个目录,因为它存储 zip 文件系统。类路径是运行 Java 时可用的环境信息。

还有一个根本问题:Scala 编译器不知道这些资源在哪里!它接收要编译的源文件,可能是目标目录,并且它有自己的类路径,但它们与运行 scalac 相关,而不是与 scalac 正在编译的代码相关。

“生成”资源的不是编译器——scalac 和 javac 都不是。它是其他工具,例如 jar(命令行工具),通常由其他工具调用,例如构建系统(ant、maven、sbt)。

因此,没有关于在哪里可以找到这些资源的信息——它们通常位于与源代码不同的目录中。您可以使用普通的 Scala 文件 i/o 支持来遍历目录等,但在编译时没有可用的“资源源”信息。

关于scala - 从 scala 宏的上下文中获取资源路径文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20510461/

相关文章:

performance - Scala:嵌套 for 循环和 for 理解之间的性能差异

scala - 如何在 Scala 宏中构造通配符类型?

java - 如何为 Java 8 LocalDateTime 编写自定义序列化器

Scala 解析器削减最后一个括号

scala - 如何使用 Spark 函数将日期从 yyyy-mm-dd 更改为 dd-mm-yyy

scala - 当列是可选的时如何从数据框中选择

scala - 突破到特定集合类型的捷径?

scala - 将函数实现以编程方式将特定类型返回到另一个函数中

scala - 除了宏注释之外,哪些宏创建方法可以避免立即类型检查?