在編譯時,如何在scala 2.11中檢索當前源文件的名稱(編寫代碼的位置)?如何在Scala 2.11中找到封裝源文件的名稱2.11
4
A
回答
4
在REPL,名字是控制檯,但是這表明一個立場知道它的來源。
scala> import scala.language.experimental.macros
import scala.language.experimental.macros
scala> import scala.reflect.macros.whitebox.Context
import scala.reflect.macros.whitebox.Context
scala> def f(c: Context): c.Tree = { import c._,universe._ ; Literal(Constant(c.enclosingPosition.source.file.name)) }
f: (c: scala.reflect.macros.whitebox.Context)c.Tree
scala> def g: String = macro f
defined term macro g: String
scala> g
res0: String = <console>
+2
'c.macroApplication.pos.source.file.name' –
5
下面是實際執行的伎倆一個有點哈克的方式:
val srcFile = new Exception().getStackTrace.head.getFileName
println(srcFile)
+1
+1爲務實的解決方案。人們可以依賴那些信息嗎? - 我的意思是,如果在編譯期間關閉調試信息會怎麼樣? – Madoc
0
或者,你可以使用@李 - 好易通的優秀sourcecode macro library
def foo(arg: String)(implicit file: sourcecode.File) = {
println(s"this file is: '${file.getAbsolutePath}'")
}
foo("hello") // "this file is '/path/to/file'"
另外,很多其他東西一樣行號,變量名稱等
相關問題
- 1. scala 2.10.4到2.11的火花
- 2. 在Scala中使用util.parsing 2.11
- 3. 2.11中的Scala腳本
- 4. 繞過Scala 2.11中的棄用警告2.11
- 5. 發出警告名Scala的陰影2.11
- 6. scala 2.11:如何將控制檯輸出重定向到文件
- 7. 如何在Travis-CI上安裝Mono 2.11+?
- 8. 將Scala從2.12降級到2.11.x
- 9. 扇貝問題和更新到Scala 2.11
- 10. 如何爲Scala 2.11的Spark組裝Cassandra連接器?
- 11. scala 2.11中的xml modularisation如何處理xml文字?
- 12. Pyaudio 2.11安裝失敗
- 13. 如何在Mac上從源碼安裝Git 2.11
- 14. 動態編譯Scala的類文件在運行時2.11
- 15. 2.10和2.11的交叉構建scala-reflect
- 16. Dataproc上的Spark 2.0和Scala 2.11?
- 17. 如何在scala 2.11中編譯延續使用sbt
- 18. 是否針對scala 2.11構建?
- 19. 使用Play配置Scala 2.11 2.5.4
- 20. 使用Scala編譯(2.11版本)
- 21. 在Xtext中訪問ParserRules 2.11
- 22. 在El Capitan上安裝R 2.11.x
- 23. EDSDK 2.11和XCode 4.5.1
- 24. Scala 2.11(/ java8)matcher不允許命名捕獲組?
- 25. 在scala 2.11中棄用scala.collection.script的替代方案?
- 26. 如何更改intellij想法以scala 2.11進行編譯?
- 27. 隱式數值在Scala 2.10中加寬,但不是2.11或2.12
- 28. 在Glibc 2.11上更新MySQL 5.1到5.62
- 29. 什麼是'斯卡拉-2.11`文件夾的IntelliJ IDEA的目的
- 30. 在jmeter 2.11中的HTTPS記錄
您需要什麼呢? 假設你有一些宏將把這個字符串粘貼到你想要的位置,它將在.class文件中。在辛格頓的sturtup上評估一次名字不是一個性能殺手。 –
當然,但是由於這些信息對編譯器來說顯然是可用的,並且它是一個常量,所以用宏檢索它似乎更加「正確」。它仍然可以使用這個:http://stackoverflow.com/a/21893197/1670894但顯然它已被scala 2.11棄用。 –
你想要一個名爲'CompilationUnit'的類的對象。我在編譯器插件中使用過它,但不太清楚如何獲取它,或者即使可以從宏中獲取它。 (可能==容易,你可以將這些對象轉換成它們的內部編譯器表示,這是一個令人討厭的任務,它使得quit寫了一些有趣的宏)。 – pedrofurla