2010-04-17 13 views
7

Les lignes suivantes fonctionnent quand je les entre dans la main sur la Scala REPL (2.7.7):traits Scala et confusion conversion implicite

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

Cependant, si je tente de compiler le fichier avec ce que je reçois le texte suivant erreur:

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

Pourquoi?

Merci!

+1

comme je l'ai remarqué dans les définitions REPL sont implicitement mis à l'intérieur d'une classe. – Alexey

Répondre

13

Les fonctions ne peuvent pas être définies au niveau supérieur. Mettez myTraitToString dans un (compagnon, si vous le souhaitez) Objet:

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

Et puis le mettre dans le périmètre:

import myTrait._ 

Chaque fois que myTraitToString est portée - à savoir quand vous pouvez l'appeler sans points - il sera appliqué implicitement.

+0

Génial, cela a fait l'affaire! – pr1001