Implementieren Sie ein Makro in einer Oberklasse und erweitern Sie es in Unterklassen
-
21-12-2019 - |
Frage
Ich möchte so etwas machen:
trait Endo {
def apply[T](x: T): T
}
trait SuperType {
def endoMap(f: Endo): SuperType = macro SuperTypeMacro.endoMapImpl
}
case class Foo(x: Int) extends SuperType {
// endoMapImpl expands to
// Foo(f(x))
}
case class Bar(x: Int, y: Boolean) extends SuperType {
// endoMapImpl expands to
// Bar(f(x), f(y))
}
Idealerweise ist das einzige, was ich schreiben müsste extends SuperType
.Ist es möglich?Wenn nicht, glaube ich, dass Makroanmerkungen dies zulassen sollten;habe ich Recht?
Lösung
Ich denke, wonach du suchst, ist c.prefix
, das den Empfänger des aktuellen Makromethodenaufrufs enthält.Sobald Sie es in der Hand haben, können Sie nach seinem Typ verzweigen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow