2010-04-17 14 views
7

Le seguenti linee funzionano quando li inserisco a mano sul Scala REPL (2.7.7):Scala tratti e conversione implicita confusione

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

Tuttavia, se provo a compilare il file con esso ottengo il seguente errore:

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

Perché?

Grazie!

+1

come ho notato nelle definizioni REPL sono implicitamente inseriti in una classe. – Alexey

risposta

13

Le funzioni non possono essere definite al livello superiore. Mettere myTraitToString in un (compagno, se vi piace) oggetto:

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

E poi portarlo in ambito:

import myTrait._ 

Ogni volta myTraitToString è portata - cioè quando si potrebbe chiamare senza puntini - sarà applicato implicitamente.

+0

Fantastico, è stato il trucco! – pr1001