Ist es möglich, den Namen der Funktion innerhalb der Funktion in scala zu erholen?
-
29-09-2019 - |
Frage
Ich möchte so etwas wie
tundef getMeASammy() {println "getMeASammy"}
def getMeADrink() {println "getMeADrink"}
def getMeASub() {println "getMeASub"}
Aber ich will nicht explizit den Namen der Funktion heraus geben.
Lösung
scala> def currentMethodName() : String = Thread.currentThread.getStackTrace()(2).getMethodName
currentMethodName: ()String
scala> def getMeASammy() = { println(currentMethodName()) }
getMeASammy: ()Unit
scala> getMeASammy()
getMeASammy
Andere Tipps
Es ist etwas empörend, aber die einzige unterstützte Möglichkeit, den Namen der aktuellen Methode von der JVM zu erhalten, ist eine Ausnahme zu erstellen (aber werfen Sie es nicht) und dann die Methodennamen Auslesen der Stack-Trace der Ausnahme.
def methodName:String= new Exception().getStackTrace().apply(1).getMethodName()
Ich schrieb eine einfache Bibliothek , die einen Makro wird mit dem Namen der Funktion zu erhalten. Es könnte eine elegantere Lösung als die Verwendung von Thread.currentThread.getStackTrace()(2).getMethodName
sein, wenn Sie nicht zusätzliche Abhängigkeit nichts dagegen:
libraryDependencies += "com.github.katlasik" %% "functionmeta" % "0.2.3" % "provided"
import io.functionmeta._
def getMeASammy() {
println(functionName) //will print "getMeASammy"
}
Nameof tut genau das, und bei der Kompilierung, so gibt es keine Ausnahmen erstellen, die Stack-Trace und anderen Reflexions-ish Kopf Inspektion.
Relevant Beispiel von nameof readme:
import com.github.dwickern.macros.NameOf._
def startCalculation(value: Int): Unit = {
println(s"Entered ${nameOf(startCalculation _)}")
}
// compiles to:
def startCalculation(value: Int): Unit = {
println(s"Entered startCalculation")
}
In Ihrem Fall
def getMeASammy() = println(nameOf(getMeASammy _))
Auch nameOf
arbeitet mit Klassen, Klassenattributen, Typen, etc.