2012-06-22 5 views
2
내가 스칼라와

중첩 된 개체 이름

class B { 
    abstract class F{ 
     def name = getClass.getSimpleName 
    } 
    object FI extends F 
} 

val b = new B 
println(b.FI) 

그것을 2.9.1 클래스에 지정된 객체의 이름을 알고 싶어

스칼라와 $

그것이 FI의 $를 인쇄 2.9.2 B $ FI를 인쇄

내가 정말로 원하는 것은 "FI"입니다. FI를 얻고 향후 스칼라 버전에서 변경되지 않도록하는 가장 좋은 방법은 무엇입니까? 나를 도울 수있는 반성의 지원이 있습니까?

+0

이 같은 행동을 보이나요? 단순한 이름 토큰 화의 작동 방식이 변경 될 수 있습니다. 단순한 이름이 클래스를 명확하게 참조하는 방법이 될 수 없으므로 일반적으로 문제가되지 않습니다. –

답변

5

다음과 같이 스칼라 2.10에 도입 된 새로운 반사 API 가능합니다 : 당신이 (대신 getSimpleName``의 즉`getName`) 정규화 된 이름을 사용하는 경우

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> val mirror = runtimeMirror(getClass.getClassLoader) 
mirror: reflect.runtime.universe.Mirror = JavaMirror with [email protected]4 of type class scala.tools.nsc.interpreter.IMain$TranslatingClassLoader with classpath <unknown> 

scala> mirror.reflect(new B().FI).symbol.name 
res24: reflect.runtime.universe.Name = FI