2010-06-23 22 views
16

me gustaría hacer algo como¿Es posible recuperar el nombre de la función dentro de la función en scala?

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

Pero, no quiero escribir de forma explícita el nombre de la función.

+1

Puede utilizar seguimientos de pila, pero no más sobre el tema debe ser mencionado entre gente educada ... –

+0

No sé nada de Scala, pero ¿no podría utilizar la API de reflexión de Java para esto? Ver p. [¿Tiene Scala una introspección capaz de algo similar al dir() de Python?] (Http://stackoverflow.com/questions/1973202/does-scala-have-introspection-capable-of-something-similar-to-pythons-dir) –

+1

Cuando alguien te pregunta tu nombre, ¿sacas tu billetera y verificas una de tus identificaciones para poder responder? –

Respuesta

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

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

scala> getMeASammy() 
getMeASammy 
+1

Supongo que si obtienes GetTrack() (3) obtienes la función llamándolo? – Zuoanqh

+0

@Zuoanqh Eso es correcto. –

+0

¿Los índices (2) o (3) alguna vez fallarán? ex. ¿Debo hacer un cheque nulo? – Raymond26

4

Es algo repugnante, pero la única forma compatible para obtener el nombre del método actual de la máquina virtual Java es crear una excepción (pero no tirarlo), y después lee el nombre del método de pila de la excepción rastro.

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

Es no es necesario para crear una excepción. Ver mi respuesta arriba, que usa 'Thread.getStackTrace()'. –

Cuestiones relacionadas