2011-07-18 23 views
8

私は、エクストラクタに暗黙的にパラメータを変換したいが、動作していないようだ。この非常に単純なケース考えてみましょう:Scala - 未適用の暗黙の変換

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")と言って問題を回避することができましたが、それをやらなければならないようには思えません。

注:この質問はthis oneに似ていますが、1)なぜこのようなことが起こっているのかについての良い答えは実際にはありません.2)例は必要以上に複雑です。

答えて

14

パターンマッチングでは暗黙的な変換は適用されません。これはバグでもコードでも問題ではなく、単にScalaのクリエイターの意思決定にすぎません。

修正するには、Stringを受け入れる別の抽出プログラムを作成する必要があります。この抽出プログラムは暗黙の変換を呼び出すことができます。

また、あなたが同様に動作するように思われる、バインドビューで試すことができ、そして後でMyStringに他の暗黙的な変換を定義した場合にも動作します:

object Apply { 
    def unapply[S <% MyString](s: S): Option[String] = Some(s.s) 
} 
+1

感謝。それは少し残念です。その決定の動機が何であるか知っていますか? – dhg

+0

はい、 'def unapply(p:String)を追加してください:Option [String] = Some(p)'を 'Apply'にしてトリックします。だから私はそれに行きます。ありがとう。 – dhg

+0

@dhg私は答えを編集しました。ビューの境界も同様に機能するようです。 –

関連する問題