【发布时间】:2011-11-14 22:34:24
【问题描述】:
我希望我的 Scala 程序能够以编程方式确定其脚本文件名或类名,将字符串存储在变量 program 中并打印出名称。
Java 对此有 several 方法。
【问题讨论】:
-
您是否尝试过采用您提到的 Java 解决方案?看起来他们都应该工作(?)
我希望我的 Scala 程序能够以编程方式确定其脚本文件名或类名,将字符串存储在变量 program 中并打印出名称。
Java 对此有 several 方法。
【问题讨论】:
我认为这是最简单的:
val program = new Exception().getStackTrace.head.getFileName
【讨论】:
按照 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>。
【讨论】:
()。
val trace 定义之后添加一个println(trace),看看.main(xxx) 是否出现在任何地方。
def 来返回程序名称,但 Scala 将 defs 视为 void 函数。你知道的越多。
package 声明不屑一顾。
不完全确定您在寻找什么...
$ scala -e 'println( "I am " + getClass.getName )'
给我
"I am Main$$anon$1"
和
$ scala -e 'try { sys.error( "" )} catch { case e => println( "I am " + e.getStackTrace()( 3 ))}'
给我
"I am Main.main(scalacmd2873893687624153305.scala)"
【讨论】:
program,然后打印出来出来。
getClass.getName 将起作用。 (它也可以在对象中工作,但看起来可能与您期望的不太一样。)
// With help from huynhjl
// http://stackoverflow.com/questions/8129185#8131613
import scala.util.matching.Regex.MatchIterator
object ScriptName {
val program = {
val filenames = new RuntimeException("").getStackTrace.map { t => t.getFileName }
val scala = filenames.indexOf("NativeMethodAccessorImpl.java")
if (scala == -1)
"<console>"
else
filenames(scala - 1)
}
def main(args: Array[String]) {
val prog = program
println("Program: " + prog)
}
}
【讨论】:
#!/bin/bash
exec scala "$0" "$0" "$@"
!#
val program = args(0)
println(program)
【讨论】:
scalac 一起编译?