Ist es möglich, den Namen der Funktion innerhalb der Funktion in scala zu erholen?

StackOverflow https://stackoverflow.com/questions/3105002

  •  29-09-2019
  •  | 
  •  

Frage

Ich möchte so etwas wie

tun
def getMeASammy() {println "getMeASammy"}
def getMeADrink() {println "getMeADrink"}
def getMeASub() {println "getMeASub"}

Aber ich will nicht explizit den Namen der Funktion heraus geben.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top