2010-06-23 2 views
16

내가 명시 적으로 함수의 이름을 입력하고 싶지 않아,scala의 함수 내에서 함수의 이름을 복구 할 수 있습니까?

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

처럼 뭔가를 좋아하지만 것입니다.

+1

당신은 내가 스칼라에 대해 아무것도 몰라 정중 회사의 언급해야 할 대상 ... –

+0

에 스택 추적,하지만 더 사용할 수 있지만이를 위해 자바 리플렉션 API를 사용하지 수 있을까? 예 : [스칼라는 파이썬의 dir()과 비슷한 것을 내성적으로 가질 수 있습니까?] (http://stackoverflow.com/questions/1973202/does-scala-have-introspection-capable-of-something-similar-to-pythons-dir)) –

+1

누군가 당신에게 당신의 이름을 묻는다면, 지갑에서 나와 대답하기 위해 당신의 신분증 중 하나를 확인합니까? –

답변

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

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

scala> getMeASammy() 
getMeASammy 
+1

getStackTrace() (3)을 호출하면 함수를 호출한다고 가정합니다. – Zuoanqh

+0

@Zuoanqh 맞습니다. –

+0

인덱스 (2) 또는 (3)이 실패할까요? 전의. Null Check를해야합니까? – Raymond26

4

이 다소 구역질, 그러나 JVM에서 현재 메소드의 이름을 얻을 수있는 유일한 지원 방법은 (그러나 던지지) 예외를 만든 다음 예외의 스택에서 메소드 이름을 읽는 것입니다 자취.

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

It 's 예외를 만들 필요는 없습니다. Thread.getStackTrace()를 사용하는 위의 내 대답을 참조하십시오. –

관련 문제