Traços de Scala e confusão de conversão implícita
-
27-09-2019 - |
Pergunta
As seguintes linhas funcionam quando eu as digito manualmente no Scala Repl (2.7.7):
trait myTrait {
override def toString = "something"
}
implicit def myTraitToString(input: myTrait): String = input.toString
object myObject extends myTrait
val s: String = myObject
No entanto, se eu tentar compilar o arquivo com ele, recebo o seguinte erro:
[error] myTrait.scala:37: expected start of definition
[error] implicit def myTraitToString(input: myTrait): String = input.toString
[error] ^
Por quê?
Obrigado!
Solução
As funções não podem ser definidas no nível superior. Colocar myTraitToString
em um objeto (companheiro, se quiser):
object myTrait {
implicit def myTraitToString(input : myTrait) : String = input.ToString
}
E então traga -o para o escopo:
import myTrait._
Sempre que o mytraittostring estiver em escopo - ou seja, quando você pode chamá -lo sem pontos -, será aplicado implicitamente.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow