使用Scala的宏斯卡拉反射(Using Scala reflection in Scala mac

2019-10-18 04:23发布

我试图使用Scala的宏为了产生一些代码,更具体,我想宏观上生成实例化一个抽象类的功能。 例如,如果是这样的抽象类:

abstract class Person {
  val name: String
  val age: Int
}

所以宏将是这样的:

  def m = macro _m
  def _m(c: Context): c.Expr[Any] = {
    import c.universe._
    c.Expr(c.parse("""
        (_name:String, _age:Int) => new Person{
            val name = _name
            val age = _age
        }   
    """))
  }

到目前为止好,问题是,宏观需求更加普遍,当然,并基于给定类的反映信息的功能。

我在斯卡拉反射和宏文件去了,我找不到如何创建可以访问给定类的反映信息的宏。

我想那个宏是这个样子

  def m = macro _m
  def _m(c: Context)(<Type of the class>): c.Expr[Any] = {
    import c.universe._
    c.Expr(c.parse("""
    <generate the function based on the type of the class>
    """))
  }

和使用的宏看起来是这样的:

val factoryFunction = m(typeOf[Person])

Answer 1:

也许你的意思是这样:

def m[T] = macro _m[T]
def _m[T: c.WeakTypeTag](c: Context) = {
  import c.universe._
  val typeOfT = weakTypeOf[T]
  // now that you have Type representing T, you can access all information about it, e.g.
  // members, type hierarchy, etc.
  ...
}

使用这种方法,你需要确保你的宏总是调用具体类型,例如,这是不行的:

class Example[T] {
  val creatorOfT = m[T]
}


文章来源: Using Scala reflection in Scala macros