これがあなたが使うことができるハックです。現在のスタックトレースをトラバースして、最初の非匿名関数を見つけます。
def printStackFrame() {
/* Get current stack trace. The first frame is this method call. */
val st = new RuntimeException().getStackTrace.view.drop(1)
// st take(5) foreach println /* Print a few frames of interest */
val name =
st.map(ste => ste.getClassName + "." + ste.getMethodName)
.dropWhile(_.matches(""".*anonfun\$\d*\.apply\$mcV\$sp$"""))
.apply(0)
println(name)
}
次のように使用できます。
class MyClass {
def mydef() {
printStackFrame()
}
def myhof(f: () => Unit) {
f()
}
}
val mc = new MyClass
mc.mydef() // Main$$anon$1$MyClass.mydef
mc.myhof(mc.mydef) // Main$$anon$1$MyClass.mydef
mc.myhof(() => {printStackFrame()}) // Main$$anon$1$MyClass.myhof
明らかな欠点は、その脆弱性です。上記の単一の正規表現で、匿名またはその他の興味深い機能をすべて無視するのに十分かどうかは、まったくわかりません。また、たとえそうであっても、将来のScalaバージョンでネーミングスキーマが変更されないという保証はありません。