使用 Scala 宏,我可以使方法调用的实现者超级吗?

Using Scala macros, can i make implementer of method call super?

能否使用 Scala 宏来使特征中方法的实现者调用超级方法。比如像这样:

trait Super {
  //some macro magic here: list = super.list ++ child.list
  def list: List[String] = List("ein", "zwei", "DIE")
}

class Sub extends Super {
  override def list: List[String] = List("4", "5")
}

object Testy extends App {
  println(new Sub().list) //List(ein, zwei, DIE, 4, 5)
}

更新: 请参阅下面@Sergey 的评论 - 这对于宏来说并不可行。

我认为在这种特殊情况下您不需要宏。为了强制将来自 superclass' 方法的一些数据添加到任何 subclass 中实现方法的所有结果中,首选方法是使用模板方法。制作一个 final def 执行固定部分的加法和一个抽象 def 声明可变部分,如下所示:

trait Super {
  protected def additionalList: List[String]
  final def list: List[String] = List("ein", "zwei", "DIE") ++ additionalList
}

class Sub extends Super {
  protected val additionalList = List("4", "5")
}

object Testy extends App {
  println(new Sub().list) // List(ein, zwei, DIE, 4, 5)
}

更新:但是,如果您确实需要原始问题中指定的行为,那么您就不走运了,我担心:宏只能影响它立即包装的内容,例如def 宏只能转换传递给方法的内容,而注释宏只能转换其直接注释者,无论是 class、字段、方法等。宏无法执行规则在甚至不知道宏的代码上。所以基本上你有两个选择:要么让你的用户手动调用 super,要么写一个注释宏,让你的用户用它来注释他们的子classes。不幸的是,这两个选项都很容易忽略。