Scala 3宏如何实现通用特质

10

我想要实现一个关于某个特性 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

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宏中访问case class的参数列表

现在由于A是一个trait,我猜你应该定义一个实现这个trait的类,并尝试类似的事情来处理这个类

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


1
这里有一个匿名类。正如 https://github.com/lampepfl/dotty-feature-requests/issues/153 所述。 - jilen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接