2014-01-22 2 views
0

ToolBox에 문자열을 제공하여 스칼라 객체를 정의하려고 시도하지만 결과로 발생하는 ModuleMirror에 대한 핸들을 얻을 수있는 방법을 찾을 수 없습니다.Module ToolBox를 통해 정의 된 스칼라 객체의 미러

import scala.reflect.runtime._ 
import scala.reflect.runtime.universe._ 
import scala.tools.reflect.ToolBox 

val src = """ object MyObject { def hello() = "world" } """ 

val mirror = universe.runtimeMirror(getClass.getClassLoader) 

val toolBox = mirror.mkToolBox() 
val tree = toolBox.parse(src) 
val value = toolBox.eval(tree) 

// convert from result of eval to RuntimeClass...? 
val runtimeClass: RuntimeClass = ??? 

val moduleSymbol = mirror.moduleSymbol(runtimeClass) 

val moduleMirror = mirror.reflectModule(moduleSymbol.asModule) 

어떤 제안 : 나는이 (가)하지만 난 도구 상자 평가의 결과에서 RuntimeClass을 얻을 수하지 않는 것 다음과 같은 것이 상상?

답변

1

개체의 클래스를 얻는 가장 좋은 방법은 컴파일 할 코드 블록에서 MyObject.getClass을 반환하는 것일 수 있습니다.

그러나 로컬 개체가 현재 스칼라 리플렉션에서 지원되지 않으므로 결과 클래스에서 moduleSymbol을 호출하면 NoSymbol이됩니다. 왜 로컬 객체입니까? eval은 평가를 위해 메서드에 제공된 코드를 래핑하기 때문에 MyObject은 래퍼 메서드에 대해 로컬이됩니다. 현재 지원되지 않는 이유는 무엇입니까? 음, 스칼라 리플렉션은 스칼라 고유의 메타 데이터를 가지고있는 @ScalaSignature 주석에 의존하며, 이러한 주석은 현재 로컬 정의를 위해 저장되지 않기 때문입니다.

ToolBox.compile (비 평가 대상 eval)을 최상위 수준 정의의 특수한 경우 처리로 변경하여 로컬로 컴파일되지 않게 할 수 있다고 생각합니다. 문제 추적자에게 문제를 제출하여 문제를 해결하는 것을 잊지 않도록 할 수 있습니까?

+0

나는 정확한 장소라고 생각하는 것에 문제 (https://issues.scala-lang.org/browse/SI-8174)를 추가했다. 귀하의 통찰력있는 답변 주셔서 감사합니다! –

+0

하하! 이전에 이미이 버그에 직면 한 것을 알고 있었지만, 이미 pull 요청을 제출했음을 기억하지 못했습니다. https://github.com/scala/scala/pull/2662. 지금 부흥 시키러 간다 :) –