2014-02-19 26 views
3

在scala中有沒有一種方法可以獲得當前文件的文件名(當編寫代碼時)?在scala中獲取當前文件的文件名

就像我的類是像COM/mysite的/應用/ myclass.scala一個文件,我想調用將返回「myclass.scala」的方法(或完整路徑......)

謝謝您!

回答

4

這可以通過Scala macros實現,這是一個可從2.10版本獲得的實驗性語言功能。

宏可以在源代碼解析階段與AST的構建進行交互,並在執行實際編譯之前修改AST樹。

由於有關彙編上下文的信息可通過Context對象在宏中使用,因此在解析階段可以檢索源文件名並將其作爲String文字返回,以便插入到位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) 
} 

宏執行和在不同的源文件中使用它的代碼必須是。返回的文件名是正確的之一,即具有宏調用的源文件的名稱。

+1

是否封閉單位不推薦使用?是完整路徑還是文件名? – matanster

+0

嗨馬特。是的,從Scala 2.11這個API已被棄用。感謝您的反饋。你可能會創建一個專門針對Scala 2.11的新問題。 –

+0

因爲這個問題不是特定於任何scala版本,也許在2.11中添加相應的解決方案作爲回答或評論,如果有一個... – matanster

相關問題