2010-04-17 13 views
7

następujące linie pracować kiedy wprowadzić je ręcznie na Scala REPL (2.7.7):Scala cechy i niejawna konwersja zamieszanie

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

Jednak gdy próbuję skompilować plik z tym mam następujące błąd:

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

Dlaczego?

Dzięki!

+1

jak zauważyłem w definicjach REPL są implicite umieszczane w klasie. – Alexey

Odpowiedz

13

Funkcje nie mogą być zdefiniowane na najwyższym poziomie. myTraitToString umieścić w (towarzysz, jeśli chcesz) obiektu:

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

, a następnie doprowadzić go do zakresu:

import myTrait._ 

Ilekroć myTraitToString jest w zakresie - czyli kiedy można nazwać bez kropek - zostanie zastosowane niejawnie.

+0

Awesome, to załatwiło sprawę! – pr1001