2010-04-17 14 views
7

Die folgenden Zeilen arbeiten, wenn ich sie mit der Hand auf dem Scala REPL eingeben (2.7.7):Scala Züge und implizite Konvertierung Verwirrung

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

Allerdings, wenn ich versuche, Datei zu kompilieren damit ich die folgenden Fehler:

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

Warum?

Danke!

+1

wie ich in REPL Definitionen festgestellt habe, sind implizit innerhalb einer Klasse. – Alexey

Antwort

13

Funktionen können nicht auf oberster Ebene definiert werden. Setzen Sie myTraitToString in einem (Begleiter, wenn Sie mögen) Objekt:

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

Und dann bringen in -umfang:

import myTrait._ 

Wenn myTraitToString ist in ihrem Umfang - das heißt, wenn Sie es ohne Punkte nennen könnte - Es wird implizit angewendet.

+0

Super, das hat den Trick gemacht! – pr1001

Verwandte Themen