Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala traits and implicit conversion confusion

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!

like image 751
pr1001 Avatar asked Apr 17 '10 22:04

pr1001


1 Answers

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.

like image 73
luqui Avatar answered Sep 19 '22 14:09

luqui