Erweitern Sie Typklassenoperationen für Elemente mithilfe von Makros
-
21-12-2019 - |
Frage
Gehen wir von folgendem Setup aus:
trait A[L] { def op(l1:L, l2:L): L }
trait E[L] { def op(l:L): L }
implicit def some2E[L:A](self:L) = new E[L] { def op(other:L) =
implicitly[A[L]].op(self,other) }
Gibt es eine Möglichkeit zur direkten Erweiterung? m op n
Zu a.op(m,n)
, in einem Kontext, in dem a
ist das entsprechende Implizit A
, Makros verwenden oder zumindest die zusätzliche Objekterstellung vermeiden?
Lösung
Wenn Sie den impliziten Parameter in den verschieben op
-Methode können Sie eine Wertklasse verwenden, um die zusätzliche Objekterstellung zu verhindern:
implicit class some2E[L](val self: L) extends AnyVal {
def op(other: L)(implicit x: A[L]) = x.op(self, other)
}
Hotspot wird den Anruf wahrscheinlich inline einleitenop
definiert in some2E
, also wirst du am Ende mit a.op(m, n)
.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow