0

考虑一个基于 Scala 宏的注释,例如来自macmemo的@memoise。注释需要两个参数:最大缓存大小和生存时间,例如,

@memoize(maxSize = 20000, expiresAfter = 2 hours)

假设您要创建一个@cacheall等效于的注释,@memoize(maxSize = Int.MaxValue, expiresAfter = 100 days)以减少样板文件并具有单点参数化。

这种类型的重用是否有标准模式?明显地,

class cacheall extends memoize(Int.MaxValue, 100 days)

由于宏中的编译时参数解析而无法工作。

4

1 回答 1

1

标准模式是使您的注释成为一个宏注释,该注释被扩展以必要的参数打开必要的注释。

import scala.annotation.StaticAnnotation
import scala.language.experimental.macros
import scala.reflect.macros.blackbox

class cacheall extends StaticAnnotation {
  def macroTransform(annottees: Any*): Any = macro cacheallMacro.impl
}

object cacheallMacro {
  def impl(c: blackbox.Context)(annottees: c.Tree*): c.Tree = {
    import c.universe._

    val memoize = q"""
      new _root_.com.softwaremill.macmemo.memoize(
        _root_.scala.Int.MaxValue, {
          import _root_.scala.concurrent.duration._
          100.days 
      })"""

    annottees match {
      case q"${mods: Modifiers} def $tname[..$tparams](...$paramss): $tpt = $expr" :: _ =>
        q"${mods.mapAnnotations(memoize :: _)} def $tname[..$tparams](...$paramss): $tpt = $expr"
    }
  }
}
于 2019-07-11T14:02:24.867 回答