私は、エクストラクタに暗黙的にパラメータを変換したいが、動作していないようだ。この非常に単純なケース考えてみましょう: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)例は必要以上に複雑です。
感謝。それは少し残念です。その決定の動機が何であるか知っていますか? – dhg
はい、 'def unapply(p:String)を追加してください:Option [String] = Some(p)'を 'Apply'にしてトリックします。だから私はそれに行きます。ありがとう。 – dhg
@dhg私は答えを編集しました。ビューの境界も同様に機能するようです。 –