是否可以从scala中的函数中恢复函数的名称?

Jij*_*ija 24 scala inspection

我想做点什么

def getMeASammy() {println "getMeASammy"}
def getMeADrink() {println "getMeADrink"}
def getMeASub() {println "getMeASub"}
Run Code Online (Sandbox Code Playgroud)

但是,我不想明确键入函数的名称.

Ric*_*arn 41

scala> def currentMethodName() : String = Thread.currentThread.getStackTrace()(2).getMethodName
currentMethodName: ()String

scala> def getMeASammy() = { println(currentMethodName()) }
getMeASammy: ()Unit

scala> getMeASammy()
getMeASammy
Run Code Online (Sandbox Code Playgroud)

  • 我假设如果您执行getStackTrace()(3),您会得到调用它的函数? (2认同)

J0H*_*0HN 6

的名字正是这样做的,并且在编译时,因此不会创建异常、检查堆栈跟踪和其他反射开销。

nameof 自述文件中的相关示例:

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")
  }
Run Code Online (Sandbox Code Playgroud)

在你的情况下

def getMeASammy() = println(nameOf(getMeASammy _))
Run Code Online (Sandbox Code Playgroud)

此外,还nameOf可以处理类、类属性、类型等。


Dav*_*ith 5

这有点令人反感,但是从JVM获取当前方法名称的唯一受支持的方法是创建一个异常(但不抛出该异常),然后从该异常的堆栈跟踪中读取该方法的名称。

def methodName:String= new Exception().getStackTrace().apply(1).getMethodName()
Run Code Online (Sandbox Code Playgroud)


Krz*_*sik 5

我编写了一个简单的库,它使用宏来获取函数的名称。Thread.currentThread.getStackTrace()(2).getMethodName如果您不介意额外的依赖性,这可能是比使用更优雅的解决方案:

libraryDependencies += "com.github.katlasik" %% "functionmeta" % "0.2.3" % "provided"
Run Code Online (Sandbox Code Playgroud)
import io.functionmeta._

def getMeASammy() {
   println(functionName) //will print "getMeASammy"
}
Run Code Online (Sandbox Code Playgroud)