Développer les opérations de classe de type sur les éléments à l'aide de macros
-
21-12-2019 - |
Question
En supposant la configuration suivante :
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) }
Existe-t-il un moyen d'étendre directement m op n
à a.op(m,n)
, dans un contexte où a
est l'implicite approprié A
, en utilisant des macros ou au moins éviter la création d'objets supplémentaires ?
La solution
Si vous déplacez le paramètre implicite vers le op
méthode, vous pouvez utiliser une classe de valeur pour empêcher la création d'objets supplémentaires :
implicit class some2E[L](val self: L) extends AnyVal {
def op(other: L)(implicit x: A[L]) = x.op(self, other)
}
Hotspot intégrera probablement l'appel auop
défini dans some2E
, donc vous finirez avec a.op(m, n)
.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow