2010-06-23 27 views
16

Ben açıkça işlevin adını yazın istemiyorum,Fonksiyonun ismini scala'daki fonksiyondan kurtarmak mümkün mü?

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

gibi bir şey yapmak ister Ama istiyorum.

+1

Benim Scala hakkında hiçbir şey bilmiyorsun kibar şirkette belirtilmelidir konu ... –

+0

üzerinde yığın izleri, ancak daha kullanabilirsiniz, ancak bunun için Java yansıma API kullanamadı? Bakınız örn. [Scala, Python'un yönergesine() benzeyen bir şey yapabildi mi?] (Http://stackoverflow.com/questions/1973202/does-scala-have-introspection-capable-of-something-similar-to-pythons-dir –

+1

Birisi size adını sorarsa, cüzdanınızı çıkarır ve kimliğinizi kontrol etmek için kimliğinizden birini işaretler misiniz? –

cevap

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

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

scala> getMeASammy() 
getMeASammy 
+1

StackTrace() (3) 'ü alırsanız işlevi çağırmak istediğinizi varsayalım? – Zuoanqh

+0

@Zuoanqh Bu doğru. –

+0

Endeksler (2) veya (3) hiç başarısız olur mu? ex. Boş bir çek mi yapmalıyım? – Raymond26

4

Biraz iğrenç ama JVM geçerli yöntemin adını almak için desteklenen tek yolu (ama atmadın) bir istisna oluşturabilir ve sonra istisnanın yığının üzerinden yöntem adı okumaktır iz.

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

Bir istisna oluşturmak için gerekli değildir. Thread.getStackTrace() 'i kullanan yukarıdaki cevabımı görün. –