scala中是否存在当前文件的文件名(编写代码时)?
就像我的类在com / mysite / app / myclass.scala这样的文件中,我想调用一个返回“myclass.scala”(或完整路径......)的方法
谢谢!
答案 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)
}
宏实现和使用它的代码必须在不同的源文件中。返回的文件名是正确的,即带有宏调用的源文件的名称。