Quiero ser capaz de hacer esto:Scala - añadir a cancelar la aplicación Int
scala> val Int(i) = "1"
i: Int = 1
Pero Int
no tiene un método unapply
.
Encontré this answer que da instrucciones sobre cómo agregar implícitamente un método a un objeto existente, así que lo probé. La solución que dieron funciona, pero desafortunadamente no para la coincidencia de patrones. Aquí es lo que tengo:
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
Estos casos de prueba son todos muy bien:
val UnapplyInt(i) = "1" // pattern matching with unapply is fine
val i = Int.unapply("1").get // implicit conversion is fine
Pero el que quiero falla:
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"
^
Si las obras de conversión implícitas y coincidencia de patrones con unapply
funciona, ¿por qué Scala no combina estas dos cosas para la coincidencia de patrones implícita?
¡Ja! Su solución propuesta es lo que estoy usando actualmente. No estoy del todo contento con él porque requiere tener dos espacios de nombres diferentes, lo que significa que no puedo tener 'Int.MaxValue' y' val Int (i) = "5" 'en el mismo lugar. – dhg
@dhg Verdadero. Y ahora que lo pienso más, creo que el razonamiento en mi respuesta no es del todo correcto. La verdadera razón es que las expresiones de patrones no pueden ser como expresiones regulares porque Scala tiene que identificar qué cosas son constructores y qué cosas son variables ... – Owen
Me perdiste en esa última parte. – dhg