私はこれを行うことができるようにしたい:
scala> val Int(i) = "1"
i: Int = 1
しかしInt
、方法がありませんunapply
。
メソッドを既存のオブジェクトに暗黙的に追加する方法を説明するこの回答を見つけたので、試してみました。彼らが提供した解決策は機能しますが、残念ながらパターン マッチングには対応していません。ここに私が持っているものがあります:
object UnapplyInt {
val IntRE = """^(\d+)$""".r
def unapply(v: String): Option[Int] = v match {
case IntRE(s) => Some(s.toInt)
case _ => None
}
}
implicit def int2unapplyInt(objA: Int.type) = UnapplyInt
これらのテスト ケースはすべて問題ありません。
val UnapplyInt(i) = "1" // pattern matching with unapply is fine
val i = Int.unapply("1").get // implicit conversion is fine
しかし、私が望むものは失敗します:
scala> val Int(i) = "1"
<console>:10: error: object Int is not a case class constructor, nor does it have an unapply/unapplySeq method
val Int(i) = "1"
^
暗黙の変換が機能し、 とのパターン マッチングがunapply
機能する場合、Scala はこれら 2 つのことを組み合わせて暗黙のパターン マッチングを行わないのはなぜでしょうか?