5

我可能使用了不正确的术语,但这里是我想要实现的示例。可以说我有以下宏:

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]

最后,我的目标是使用宏将生成的字段添加到案例类中。也许有更好的方法来做到这一点?

4

1 回答 1

2

如果这在 2.10.0 中成为可能,我会感到惊讶。

使用宏类型或宏注释(http://scalamacros.org/future.html)应该非常简单。我们将在发布 2.10.0-final 后立即着手开发这些新的宏,但很难预测 ETA。也许是 2012 年的冬天 - 2013 年的春天。

于 2012-09-04T15:03:24.197 回答