【发布时间】:2013-12-23 21:11:00
【问题描述】:
是否可以使用 scala 宏执行以下操作:
trait Cacheable {
def cache[T](genValue: => Future[T]): Future[T] = macro Cacheable.cacheImpl[T]
}
object Cacheable {
def cacheImpl[A: c.WeakTypeTag](c: Context)
(genValue: c.Expr[Future[A]]): c.Expr[Future[A]] = {
import c.universe._
reify {
genValue.splice
}
}
}
它不会在 Cacheable 特征中的宏函数调用中编译,并显示以下消息:
此行有多个标记 - 宏实现的形状错误:必需: (c: scala.reflect.macros.Context)(genValue: c.Expr[=> scala.concurrent.Future[T]]): c.Expr[scala.concurrent.Future[T]] 找到: (c: scala .reflect.macros.Context)(genValue: c.Expr[scala.concurrent.Future[A]]): c.Expr[scala.concurrent.Future[A]] 参数genValue的类型不匹配: c.Expr[=> scala.concurrent.Future[T]] 不符合 c.Expr[scala.concurrent.Future[?A]] - 宏实现的形状错误:需要:(c: scala.reflect.macros.Context)(genValue: c.Expr[=> scala.concurrent.Future[T]]): c.Expr[scala.concurrent.Future[T]] found : (c: scala.reflect.macros.Context)(genValue: c.Expr[ scala.concurrent.Future[A]]): c.Expr[scala.concurrent.Future[A]] 参数 genValue 类型不匹配: c.Expr[=> scala.concurrent.Future[T]] 不符合 c .Expr[scala.concurrent.Future[?A]]
【问题讨论】: