我写

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内,如果有的话,因为是源类型)从FractionInt的隐式转换。

关于scala - 隐式转换,是否需要导入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4569192/

10-09 02:53