我希望能够做到这一点:
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不将这两个东西放在一起进行隐式模式匹配呢?