views:

196

answers:

1

The following lines work when I enter them by hand on the Scala REPL (2.7.7):

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

However, if I try to compile file with it I get the following error:

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

Why?

Thanks!

+6  A: 

Functions can't be defined at the top level. Put myTraitToString in a (companion, if you like) object:

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

And then bring it into scope:

import myTrait._

Whenever myTraitToString is in scope -- i.e. when you could call it without any dots -- it will be applied implicitly.

luqui
Awesome, that did the trick!
pr1001