scala 3 宏如何实现通用特征

jil*_*len 8 scala dotty scala-3

我想实现proxy一些特征A(例如委托方法调用到一些 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
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

但是编译器抱怨

A is not a class type

Run Code Online (Sandbox Code Playgroud)

Dmy*_*tin 1

如果A是一个类你可以尝试替换

'{
  new A {
    $exprs
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

如何在点宏中访问案例类的参数列表

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

使用 Scala 3 宏覆盖方法(自 Scala 3.1.3 起)