微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala 3 宏如何实现通用特征

如何解决scala 3 宏如何实现通用特征

我想实现一些特征 proxyA(例如将方法调用委托给一些 rpc 调用),就像这样

   def clientProxy[A](using Type[A],Quotes): Expr[A] = {
    import quotes.reflect._
    val defTrees: List[Tree] = TypeRepr.of[A].typeSymbol.memberFields.collect {
      case mf if mf.isDefDef =>
        ???
    }

    val exprs = Expr.ofList(defTrees.map(_.asExpr))
    '{
      new A {
        $exprs
      }
    }
  }

但编译器抱怨

A is not a class type

解决方法

如果A是一类,你可以尝试更换

'{
  new A {
    $exprs
  }
}

Apply(
  Select.unique(New(TypeTree.of[A]),"<init>"),defTrees.map(_.asExpr.asTerm)
).asExprOf[A]

(Scala 3.0.0-RC1-bin-20210106-e39b79e-NIGHTLY)

How to access parameter list of case class in a dotty macro

现在,因为A是一个特点,我想你应该定义一个类实现这个特点,并尝试类似的事情,这个类。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。