在scala中获取当前文件的文件名

时间:2014-02-19 19:09:09

标签: scala scala-2.10

scala中是否存在当前文件的文件名(编写代码时)?

就像我的类在com / mysite / app / myclass.scala这样的文件中,我想调用一个返回“myclass.scala”(或完整路径......)的方法

谢谢!

1 个答案:

答案 0 :(得分:4)

这可以通过Scala macros来实现,AST是2.10版本提供的实验性语言功能。

宏可以在源代码解析阶段与{{3}}的构建进行交互,并在执行实际编译之前修改AST的树。

由于有关编译上下文的信息可通过Context对象用于宏,因此在解析阶段可以检索源文件名并将其作为String返回literal,用于代替AST中的宏调用。

以下是返回源文件名的工作示例。该示例分为两个文件:

定义和实现宏的源文件:

// Contents of: "Macros.scala"

import scala.reflect.macros.Context
import scala.language.experimental.macros

object Macros {
    def sourceFile: String = macro sourceFileImpl
    def sourceFileImpl(c: Context) = {
        import c.universe._
        c.Expr[String](Literal(Constant(c.enclosingUnit.source.path.toString)))
    }
}

使用宏的另一个源文件:

// Contents of: "Main.scala"

object Main extends App {
    val fileName = Macros.sourceFile
    println(fileName)
}

宏实现和使用它的代码必须在不同的源文件中。返回的文件名是正确的,即带有宏调用的源文件的名称。