8

エクストラクタでパラメータを暗黙的に変換したいのですが、機能していないようです。この非常に単純なケースを考えてみましょう。

case class MyString(s: String) {}

implicit def string2mystring(x: String): MyString = new MyString(x)
implicit def mystring2string(x: MyString) = x.s

object Apply {
    def unapply(s: MyString): Option[String] = Some(s)
}

しかし、私はそれを期待どおりに使用することができません:

val Apply(z) = "a"  // error: scrutinee is incompatible with pattern type

Stringパラメータをからに変換できない理由を誰かが説明できますMyStringか?私はそれがその場で呼び出すことを期待しstring2mystring("a")ます。明らかに私はこの問題を回避することができますval Apply(y) = MyString("a")が、そうしなければならないようには思えません。

注:この質問はこれに似ていますが、1)なぜこれが起こっているのかについて、実際には良い答えがない、2)例は必要以上に複雑です。

4

1 に答える 1

14

パターンマッチングの場合、暗黙的な変換は適用されません。これはコードのバグや問題ではなく、Scalaの作成者による設計上の決定にすぎません。

これを修正するには、aを受け入れる別のエクストラクタを作成する必要がありますString。これにより、暗黙の変換を呼び出すことができます。

または、ビューバウンドを試してみることができます。これも機能するようで、後で他の暗黙的な変換を次のように定義した場合にも機能しますMyString

object Apply {
  def unapply[S <% MyString](s: S): Option[String] = Some(s.s)
}
于 2011-07-18T17:18:14.740 に答える