Ich möchte dies tun können:
scala> val Int(i) = "1"
i: Int = 1
Aber Int
hat keine unapply
Methode.
Ich fand diese Antwort die Anweisungen zum impliziten Hinzufügen einer Methode zu einem bestehenden Objekt enthält, habe ich es ausprobiert. Die dort angegebene Lösung funktioniert, aber leider nicht für den Musterabgleich. Hier ist, was ich habe:
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
Diese Testfälle sind alle in Ordnung:
val UnapplyInt(i) = "1" // pattern matching with unapply is fine
val i = Int.unapply("1").get // implicit conversion is fine
Aber die, die ich will, scheitert:
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"
^
Wenn die implizite Konvertierung funktioniert und der Mustervergleich mit unapply
funktioniert, warum fügt Scala diese beiden Dinge nicht für den impliziten Mustervergleich zusammen?