2010-06-23 13 views
16

mi piacerebbe fare qualcosa di simileÈ possibile recuperare il nome della funzione dalla funzione in scala?

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

Ma, io non voglio scrivere esplicitamente il nome della funzione.

+1

È possibile utilizzare le tracce di stack, ma non più su questo argomento dovrebbe essere menzionato in compagnia educata ... –

+0

Non so niente di Scala, ma non si potrebbe utilizzare la riflessione API Java per questo? Vedi per es. [Scala ha un'introspezione capace di qualcosa di simile alla dir()?] Di Python (http://stackoverflow.com/questions/1973202/does-scala-have-introspection-capable-of-something-similar-to-pythons-dir –

+1

Quando qualcuno ti chiede il tuo nome, esci dal tuo portafoglio e controlli uno dei tuoi ID per poter rispondere? –

risposta

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

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

scala> getMeASammy() 
getMeASammy 
+1

Suppongo che se ottieni getStackTrace() (3) ottieni la funzione che la chiama? – Zuoanqh

+0

@Zuoanqh Proprio così. –

+0

Gli indici (2) o (3) avranno mai esito negativo? ex. dovrei fare un assegno nulla? – Raymond26

4

E 'un po' schifo, ma l'unico modo supportato per ottenere il nome del metodo corrente dalla JVM è quello di creare un'eccezione (ma non buttarlo), e poi leggere il nome del metodo di stack del un'eccezione traccia.

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

È non è necessario creare un'eccezione. Vedi la mia risposta sopra, che usa 'Thread.getStackTrace()'. –

Problemi correlati