Scala 2.10中的抽象反射API



Scala 2.10提供了一个很棒的反射API。但是,它有两个入口点:运行时范围和宏上下文范围。

当使用运行时反射时,您应该导入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.MemberScopeMyReflection.u.MemberScope具有相同的API。有没有一种方法可以抽象不同的宇宙?

或者我可能在尝试导出反射工件(本例中为MemberScope)时做了一些哲学上的错误?

你可以接受宇宙作为一个参数:

class MyReflection(val u: scala.reflect.api.Universe) {
  import u._
  def foo[T : TypeTag] = implicitly[TypeTag[T]].tpe.members
}

val x = new MyReflection(scala.reflect.runtime.universe)

请注意,您必须通过MyReflection的实例来引用宇宙,以获得正确的路径依赖类型。

val members: x.u.MemberScope = x.foo[String]

相关内容

  • 没有找到相关文章

最新更新