【发布时间】:2013-06-04 04:25:51
【问题描述】:
Scala 2.10 带有一个很棒的反射 API。但是,它有两个入口点:运行时 Universe 和宏上下文 Universe。
使用运行时反射时,应导入scala.reflect.runtime.universe。在宏实现中使用反射时,您应该从上下文中导入 Universe。
是否可以编写一些适用于两种环境的代码?应该如何获得universe?
考虑这个例子:
class MyReflection(val u: scala.reflect.api.Universe) {
import u._
def foo[T: TypeTag] = implicitly[TypeTag[T]].tpe.members // returns MyReflection.u.MemberScope
}
val x = new MyReflection(scala.reflect.runtime.universe)
val members: scala.reflect.runtime.universe.MemberScope = x.foo[String] // BANG! Compiler error
由于类型不匹配,这将无法编译。同时,很明显,此示例中的scala.reflect.runtime.universe.MemberScope 和MyReflection.u.MemberScope 共享相同的API。有没有办法对不同的宇宙进行抽象?
或者我可能在尝试导出反射工件(本例中为MemberScope)时做一些哲学上的错误?
【问题讨论】:
标签: scala reflection macros scala-macros