[英]Can Scala macros generate the methods and implictits in this situation?
我想使用 scala 宏來進行某種代碼生成。 具體來說,我定義了一些Event
類型,這些事件將被推送到同一個方法(這里workImpl
)並返回一個特定類型的值。 如果我只是調用workImpl
,返回類型是不確定的,因為它處理不同的輸入並返回不同的結果。 但是輸入類型和 output 類型之間的 map 是確定的。 目標是使返回類型可用。
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.