scala - Scala 宏能否在这种情况下生成方法和隐含?
问题描述
我想使用 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]
}
那么,这是否可能以及如何实现呢?如果不可能,还有其他解决方案吗?
解决方案
我终于找到了一个可行的解决方案。
object A {
private def workImpl(x: Any): Any = x match {
case e: X => XRet(0)
case e: Y => YRet(0)
case e: Z => ZRet(0)
}
trait Event
trait EventReturn[T] extends Event
case class X() extends EventReturn[XRet]
case class Y() extends EventReturn[YRet]
case class Z() extends EventReturn[ZRet]
case class XRet(x:Int)
case class YRet(y:Int)
case class ZRet(z:Int)
def work3[T](x: EventReturn[T]): T = workImpl(x).asInstanceOf[T]
def main(args: Array[String]): Unit = {
work3(X()).x
work3(Y()).y
work3(Z()).z
}
}
推荐阅读
- php - 当月份设置为荷兰语时,如何比较日期
- javascript - getBackgroundThrottling() 或 Electron 上的等价物?
- jenkins - Jenkins Pipeline:如何从管道内禁用当前作业?
- swift - 为什么每次上传照片时,firebase 存储都会覆盖应保留所有用户图像的存储?
- javascript - 使用 JS 从 CSS 更改 BackgroundImage
- get - 如何在 apex 中创建 httpsrequest 'Get',然后在 Salesforce 中更新记录
- html - 移动浏览器无法显示特定图像
- reactjs - 未定义无法从 app.js 解析模块 react-navigation-stack
- python - 在pygame中执行for循环后图像不会保留在屏幕上
- android - 获取.NET CORE 3 webApi时反应本机引发网络错误