Скала черты и неявное преобразование путаницы - PullRequest
7 голосов
/ 18 апреля 2010

Следующие строки работают, когда я ввожу их вручную в REPL Scala (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

Однако, если я пытаюсь скомпилировать файл с ним, я получаю следующую ошибку:

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

Почему?

Спасибо!

1 Ответ

13 голосов
/ 18 апреля 2010

Функции не могут быть определены на верхнем уровне. Поместите myTraitToString в (компаньон, если хотите) объект:

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

А затем перенесите его в область:

import myTrait._

Всякий раз, когда myTraitToString находится в области видимости, т.е. когда вы можете вызывать его без каких-либо точек, он будет применяться неявно.

...