2

コンパニオンオブジェクトの暗黙が見つかると思いました。これの何が問題なのですか?

object Elsewhere{
    case class NamedInt(i: Int, name: String)
    object NamedInt{
        implicit class ToNamedInt(i: Int){
            def named(name: String) = NamedInt(i, name)
        }
    }
}

object Application{
    import Elsewhere.NamedInt

    //Error: value named is not a member of Int
    val named: NamedInt = 3.named("bob") 
}

更新:暗黙のクラスを直接インポートできることはわかっていますが、暗黙のクラスはコンパニオン オブジェクトにあるため、それなしでコンパイルする必要があると考えました。たとえば、これは追加のインポートなしで機能します

object Elsewhere{
    case class MyInt(i: Int)
    object MyInt{
        import scala.language.implicitConversions
        implicit def myIntToSome(t: MyInt): Some[Int] = Some(t.i)
    }

}

object Application{
    import Elsewhere.MyInt

    val o: Option[Int] = MyInt(1) 
}

更新 2 :

Jesse Eichar は彼のブログで次のようにコメントしています

暗黙的なパラメーター解決と暗黙的なオブジェクト変換を混同しています。暗黙的なオブジェクト変換は潜在的に危険であるため、通常は明示的にスコープにインポートする必要があります。

それに対する注意点は、スーパークラスで定義された暗黙的なオブジェクト変換であり、(私はかなり確信しています) パッケージ内のオブジェクトは自動的にスコープ内にあります。

これは私には理にかなっていますが、なぜMyInt上記の例が機能するのでしょうか?

4

1 に答える 1

2

1 行余分に追加すると問題が解決します (コンパニオン オブジェクト フィールドも明示的にインポートする必要があります)。

object Application{
    import Elsewhere.NamedInt
    import Elsewhere.NamedInt._

    // Compiles OK now :)
    val named: NamedInt = 3.named("bob")
}
于 2013-10-12T08:42:09.780 に答える