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

时间:2010-06-23 19:50:05

标签: scala inspection

我想做点什么

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

但是,我不想明确地输出函数的名称。

4 个答案:

答案 0 :(得分:35)

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

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

scala> getMeASammy()
getMeASammy

答案 1 :(得分:3)

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

  def methodName:String= new Exception().getStackTrace().apply(1).getMethodName()

答案 2 :(得分:2)

我写了一个simple library,它使用宏来获取函数的名称。如果您不介意其他依赖性,它可能比使用Thread.currentThread.getStackTrace()(2).getMethodName更为优雅:

libraryDependencies += "com.github.katlasik" %% "functionmeta" % "0.2.3" % "provided"
import io.functionmeta._

def getMeASammy() {
   println(functionName) //will print "getMeASammy"
}

答案 3 :(得分:2)

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")
  }

以您的情况

def getMeASammy() = println(nameOf(getMeASammy _))

此外,nameOf适用于类,类属性,类型等。