Как мне получить текущий скрипт или имя класса в Scala? - PullRequest
3 голосов
/ 15 ноября 2011

Я бы хотел, чтобы моя программа Scala могла программно определять либо имя файла сценария, либо имя класса, сохранять строку в переменной program и распечатывать имя.

Java имеет несколько методов для этого.

Ответы [ 5 ]

3 голосов
/ 09 марта 2015

Я думаю, что это самое простое:

val program = new Exception().getStackTrace.head.getFileName
2 голосов
/ 15 ноября 2011

При анализе трассировки стека в соответствии с подсказкой 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>.

1 голос
/ 15 ноября 2011
// 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)
    }
}

Код Розетты

1 голос
/ 15 ноября 2011

Не совсем уверен, что вы ищете ...

$ 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)"
0 голосов
/ 13 мая 2013
#!/bin/bash
exec scala "$0" "$0" "$@"
!#

val program = args(0)
println(program)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...