2

我正在尝试使用 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
        }   
    """))
  }

到目前为止一切都很好,问题是宏当然需要更通用,并根据给定类的反射信息生成函数。

我浏览了 Scala 反射和宏文档,但找不到如何创建可以访问给定类的反射信息的宏。

我希望那个宏看起来像这样

  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])
4

1 回答 1

4

也许你的意思是这样的:

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]
}
于 2013-05-24T20:12:28.680 回答