9

我想实现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
      }
    }
  }

但是编译器抱怨

A is not a class type

4

1 回答 1

1

如果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)

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

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

于 2021-01-07T15:56:41.530 回答