Я хочу быть в состоянии сделать это:
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 не объединяет эти две вещи для неявного сопоставления с образцом?