2010-04-17 23 views
7

Las siguientes líneas de trabajo cuando les entro con la mano en la Scala REPL (2.7.7):Scala rasgos y conversión implícita confusión

trait myTrait { 
    override def toString = "something" 
} 
implicit def myTraitToString(input: myTrait): String = input.toString 
object myObject extends myTrait 
val s: String = myObject 

Sin embargo, si intento compilar archivos con ella me sale el siguiente error:

[error] myTrait.scala:37: expected start of definition 
[error] implicit def myTraitToString(input: myTrait): String = input.toString 
[error]  ^

¿Por qué?

Gracias!

+1

Como noté en REPL las definiciones se ponen implícitamente dentro de una clase. – Alexey

Respuesta

13

Las funciones no se pueden definir en el nivel superior. Ponga myTraitToString en un (compañera, si lo desea) objeto:

object myTrait { 
    implicit def myTraitToString(input : myTrait) : String = input.ToString 
} 

Y luego ponerla en alcance:

import myTrait._ 

Siempre que esté en el ámbito myTraitToString - es decir, cuando se podría llamar sin puntos - se aplicará implícitamente.

+0

¡Impresionante, eso funcionó! – pr1001

Cuestiones relacionadas