Je veux être en mesure de le faire:Scala - ajouter unapply à Int
scala> val Int(i) = "1"
i: Int = 1
Mais Int
n'a pas une méthode unapply
.
J'ai trouvé this answer qui donne des instructions sur la façon d'ajouter implicitement une méthode à un objet existant, donc je l'ai essayé. La solution qu'ils ont donné fonctionne, mais malheureusement pas pour le filtrage. Voici ce que j'ai:
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
Ces cas de test sont tous très bien:
val UnapplyInt(i) = "1" // pattern matching with unapply is fine
val i = Int.unapply("1").get // implicit conversion is fine
Mais celui que je veux échoue:
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 les travaux de conversion implicites et le modèle correspondant à unapply
fonctionne, pourquoi Scala ne met-il pas ces deux choses ensemble pour un appariement de formes implicite?
Ha! Votre solution proposée est ce que j'utilise actuellement. Je ne suis pas entièrement satisfait car cela nécessite deux espaces de noms différents, ce qui signifie que je ne peux pas avoir 'Int.MaxValue' et' val Int (i) = "5" 'au même endroit. – dhg
@dhg True. Et maintenant que je pense plus à ce sujet, je pense que le raisonnement dans ma réponse n'est pas tout à fait correct. La vraie raison est que les expressions de modèle ne peuvent pas être comme des expressions régulières parce que Scala doit identifier quelles choses sont des constructeurs et quelles sont les variables ... – Owen
Vous m'avez perdu sur cette dernière partie. – dhg