При анализе трассировки стека в соответствии с подсказкой 0__ следует позаботиться о большинстве случаев использования, в частности, когда объект с методом main не находится в файле с тем же именем:
package utils
trait ProgramInfo {
val programInfo = try {
throw new RuntimeException("x")
} catch {
case e: RuntimeException =>
val arr = new java.io.CharArrayWriter()
val buffer = new java.io.PrintWriter(arr)
e.printStackTrace(buffer)
val trace = arr.toString
val lines = io.Source.fromString(trace)
val pat = """^.*at.*\.main\(([^:]*)(:.*)?\).*$""".r
lines.getLines().collectFirst{case pat(n, l) => n}.getOrElse("<none>")
}
}
object ProgramInfo extends ProgramInfo
Тогда вы называете это так:
println(utils.ProgramInfo.programInfo)
или вы смешиваетесь с основным объектом
object A extends utils.ProgramInfo {
def main(args: Array[String]) {
println(programInfo)
}
}
Это работает для сценариев scala A.script
вне зависимости от того, заключен код в объект или нет. Это также работает при компиляции с scalac
и запуске как scala A
. При запуске с REPL это вернет <none>
.