我写
object MyString {
implicit def stringToMyString(s: String) = new MyString(s)
}
class MyString(str: String) {
def camelize = str.split("_").map(_.capitalize).mkString
override def toString = str
}
object Parse {
def main(args: Array[String]) {
val x = "active_record".camelize
// ...
}
}
在我的程序中。这会导致编译错误。我插入后
import MyString.stringToMyString
然后就可以了。
从Odersky的Scala编程中,我知道不需要导入源或预期目标类型的伴随对象中的隐式转换。
最佳答案
随播广告中的隐式转换
源或预期的对象
目标类型不必是
进口的。
足够真实。现在,方法camelize
是在类MyString
上定义的,并且确实在其对象伴侣中存在对MyString
的隐式转换。但是,代码中没有任何内容告诉编译器MyString
是预期的目标类型。
相反,如果您这样写:
val x = ("active_record": MyString).camelize
那么它将起作用,因为编译器会知道您希望
"active_record"
是MyString
,从而使它在对象MyString
中查找隐式转换。这可能看起来有点限制性,但实际上它可以在许多地方使用。举例来说,您有:
class Fraction(num: Int, denom: Int) {
...
def +(b: Fraction) = ...
...
}
然后,您得到了如下代码:
val x: Fraction = ...
val y = x + 5
现在,
x
确实有一个+
方法,其预期类型为Fraction
。因此,在这里,编译器将在对象Int
内(以及对象Fraction
内,如果有的话,因为是源类型)从Fraction
到Int
的隐式转换。关于scala - 隐式转换,是否需要导入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4569192/