Scala 在包内具体化实现

Scala 在包内具体化实现,scala,scala-macros,Scala,Scala Macros,当使用宏来具体化trait的实现时,我希望在包中创建实现,以便它能够访问其他包私有类 trait MyTrait[T] object MyTrait { implicit def materialize[T]: MyTrait[T] = macro materializeImpl[T] def materializeImpl[T : c.WeakTypeTag](c: blackbox.Context): c.Expr[MyTrait[T]] = { val tt = wea

当使用宏来具体化trait的实现时,我希望在包中创建实现,以便它能够访问其他包私有类

trait MyTrait[T]

object MyTrait {
  implicit def materialize[T]: MyTrait[T] = macro materializeImpl[T]

  def materializeImpl[T : c.WeakTypeTag](c: blackbox.Context): c.Expr[MyTrait[T]] = {
    val tt = weakTypeTag[T]
    c.Expr[MyTrait[T]](q"new MyTrait[$tt] {}")
  }
}

是否可以在特定的包中具体化新的MyTrait[$tt]{}?

宏必须展开为AST,AST将在宏调用所在的位置编译。由于
package
声明和方法调用不被允许,扩展树无法在另一个包中创建任何内容。

正如Alexey Romanov指出的那样,这是不可能直接实现的。但是,如果只调用几个方法(如果使用宏,很可能就是这样),一个可能的(但不是完美的)解决方法可能是创建一个公共抽象类或trait,扩展目标trait,并将所有必需的包私有方法“发布”为
protected
代理。因此,您可以通过从该抽象类而不是trait继承来在宏中创建实例。显然,这个技巧有效地将这些方法“泄漏”给了任何人,但由于反射,任何人都可以调用任何方法,如果他真的想要的话。滥用这一技巧会像使用反射一样显示出刻意回避分离的努力。

在他的论文中,尤金·布尔马科回顾了宏扩展中的顶级定义:(第116-117、122页)是的,我应该指定“def宏”,因为这是问题的要求。我认为这是有意义的。谢谢你的回答。我现在已经实施了这样一个解决方案——不过谢谢你的批准:)