我写
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 编程 中,我发现不需要导入源或预期目标类型的伴生对象中的隐式转换。
最佳答案
implicit conversion in the companion object of the source or expected target types don't need to be imported.
确实如此。现在,方法 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
。因此,编译器会在此处查找对象 Fraction
内(以及对象 Int 内)从
,如果有的话,因为那是源类型)。Int
到 Fraction
的隐式转换
关于scala - 隐式转换,是否需要导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4569192/