Expanda classe de tipo de operações em elementos usando macros
-
21-12-2019 - |
Pergunta
Supondo a seguinte configuração:
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 uma maneira diretamente expandir m op n
para a.op(m,n)
, em um contexto onde a
é apropriado implícito A
, usando macros, ou pelo menos evitar o adicional de criação do objeto?
Solução
Se você mover o parâmetro implícito para o op
método, você pode usar uma classe de valor para impedir que o adicional de criação de objeto:
implicit class some2E[L](val self: L) extends AnyVal {
def op(other: L)(implicit x: A[L]) = x.op(self, other)
}
Hotspot provavelmente inline a chamada para oop
definido no some2E
, assim você vai acabar com a.op(m, n)
.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow