我可能使用了不正确的术语,但这里是我想要实现的示例。可以说我有以下宏:
def generateField[T]: AnyRef =
macro generateFieldImpl[T]
def generateFieldImpl[T: c.AbsTypeTag](c: Context): c.Expr[AnyRef] = {
/**
* here I'm looking at the type T by reflection to see now many members it has
* and based on that I'm generating TupleN[Array[Byte], ...](null, ...)
* where N is number of members in class represented by type T
*/
}
我打算只使用案例类作为 T。
当我将此宏与案例类一起使用时,它效果很好,但现在我想添加一个抽象级别:
trait WithGeneratedField[T] {
val _myField = generateField[T]
}
我遇到的问题是宏在声明特征时被扩展,此时 T 被称为抽象类型“T”。有什么方法可以推迟宏扩展,直到我将这个特性与具体的东西混合在一起?例如:
case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass]
最后,我的目标是使用宏将生成的字段添加到案例类中。也许有更好的方法来做到这一点?