2010-06-23 26 views
16

Je voudrais faire quelque chose commeEst-il possible de récupérer le nom de la fonction depuis la fonction dans scala?

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

Mais, je ne veux pas taper explicitement le nom de la fonction.

+1

Vous pouvez utiliser des traces de la pile, mais pas plus sur le sujet devrait être mentionné dans la société polie ... –

+0

Je ne sais rien à propos de Scala, mais vous ne pourriez pas utiliser l'API de réflexion Java pour cela? Voir par exemple [Est-ce que Scala a l'introspection capable de quelque chose de semblable à dir() de Python?] (Http://stackoverflow.com/questions/1973202/does-scala-have-introspection-capable-of-something-similar-to-pythons-dir –

+1

Lorsqu'une personne vous demande votre nom, sortez-vous de votre portefeuille et cochez l'un de vos identifiants pour répondre? –

Répondre

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

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

scala> getMeASammy() 
getMeASammy 
+1

Je suppose que si vous obtenez getStackTrace() (3) vous obtenez la fonction l'appelant? – Zuoanqh

+0

@Zuoanqh C'est vrai. –

+0

Les indices (2) ou (3) vont-ils jamais échouer? ex. devrais-je faire un contrôle nul? – Raymond26

4

Il est un peu révoltant, mais la seule façon soutenue pour obtenir le nom de la méthode actuelle de la machine virtuelle Java est de créer une exception (mais pas le jeter), puis lire le nom de la méthode de la pile de l'exception trace.

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

pas nécessaire de créer une exception. Voir ma réponse ci-dessus, qui utilise 'Thread.getStackTrace()'. –