【发布时间】:2020-04-08 01:06:49
【问题描述】:
我想使用 scala 宏来生成某种代码。具体来说,我定义了一些Event 类型,这些事件将被推送到同一个方法(此处为workImpl)并返回特定类型的值。如果我只是调用workImpl,返回类型是不确定的,因为它处理不同的输入并返回不同的结果。但是输入类型和输出类型之间的映射是确定的。 目标是使返回类型可用。
Scala 宏非常棒,可能会有所帮助。我想通过为每个事件类型添加事件返回类型注释来实现自动代码生成。应该生成的代码是code1 或 code2。
object A {
private def workImpl(x: Any): Any = ???
@anno(X_RET)
case class X()
@anno(Y_RET)
case class Y()
@anno(Z_RET)
case class Z()
// code1: auto generate work1 and the implicits
def work1[T](x:T)(implicit ev: T=>M) = workImpl(x).asInstanceOf[M]
implicit val X_TO_X_RET: X=>X_RET = null
implicit val Y_TO_Y_RET: Y=>Y_RET = null
implicit val Z_TO_Z_RET: Z=>Z_RET = null
// code2: auto generate these methods
def work2(x:X) = workImpl(x).asInstanceOf[X_RET]
def work2(x:Y) = workImpl(x).asInstanceOf[Y_RET]
def work2(x:Z) = workImpl(x).asInstanceOf[Z_RET]
}
那么,这是否可能以及如何实现呢?如果不可行,还有什么办法吗?
【问题讨论】:
-
据我所知,scala 宏不能修改其范围之外的东西,尽管它们可以创建全新的类。
标签: scala code-generation scala-macros