Espandi le operazioni di classe di tipo su elementi usando macro
-
21-12-2019 - |
Domanda
Supponendo la seguente configurazione:
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) }
.
C'è un modo per espandere direttamente m op n
a a.op(m,n)
, in un contesto in cui a
è l'appropriato Implicit A
, utilizzando macro o almeno evitare la creazione di oggetti aggiuntivi?
Soluzione
Se si sposta il parametro implicito sul metodo op
, è possibile utilizzare una classe di valore per impedire la creazione dell'oggetto aggiuntivo:
implicit class some2E[L](val self: L) extends AnyVal {
def op(other: L)(implicit x: A[L]) = x.op(self, other)
}
.
Hotspot sarà probabilmente in linea la chiamata a Theop
definita in some2E
, quindi finirai con a.op(m, n)
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow