2010-04-17 185 views
7

以下行工作(2.7.7):斯卡拉性状和隐式转换混乱时,我的手在斯卡拉REPL进入他们

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

正如我在REPL定义中注意到的,它隐式地放在类中。 – Alexey 2010-04-18 08:57:36

回答

13

无法在顶层定义函数。把myTraitToString在(伴侣,如果你喜欢)对象:

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

然后把它纳入范围:

import myTrait._ 

每当myTraitToString在范围上 - 即当你可以把它没有任何点 - 它将被隐式应用。

+0

真棒,那就是诀窍! – pr1001 2010-04-17 23:19:25