Scala: Mélange de traits et de la classe de cas dans le modèle de match
Je veux correspondre à certaines classes de cas. Si je ne les connais pas, je veux correspondre à un certain trait de classes en extension. Cela ressemble à
trait Event //root trait
trait Status extends Event //special trait
trait UIEvent extends Event //special trait
case class Results extends Event //concrete case class
case class Query extends Event //concrete case class
case class Running extends Status //concrete case class
case class Finished extends Status //concrete case class
case class Update extends UIEvent //concrete case class
J'ai exécuter le test suivant
val events = List(Results, Query, Running, Finished, Update)
events foreach {
case Results => println("Got a Results")
case Running => println("Got a Running")
case s:Status => println("Got some StatusEvent")
case ui:UIEvent => println("Got some UIEvent")
case e: Event => println("Generic Event")
case x => println("Didn't matched at all " + x)
}
println("############################")
val STATUS = classOf[Status]
val EVENT = classOf[Event]
val UIEVENT = classOf[UIEvent]
val RESULTS = classOf[Results]
val eventsClass = events map (_.getClass)
eventsClass foreach {
case RESULTS => println("Got a Results")
case STATUS => println("Got some StatusEvent")
case UIEVENT => println("Got some UIEvent")
case EVENT => println("Generic Event")
case x => println("Didn't matched at all " + x)
}
qui mène à la sortie suivante
Got a Results
Didn't match at all Query
Got a Running
Didn't match at all Finished
Didn't match at all Update
############################
Didn't match at all class de.mukis.scala.test.main.Results$
Didn't match at all class de.mukis.scala.test.main.Query$
Didn't match at all class de.mukis.scala.test.main.Running$
Didn't match at all class de.mukis.scala.test.main.Finished$
Didn't match at all class de.mukis.scala.test.main.Update$
Pourquoi je ne peux pas en correspondance du modèle sur des cas de la classe et des traits de personnalité ou tout simplement que dans la classe?
thx à l'avance,
Muki
OriginalL'auteur Muki | 2011-09-29
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous faites référence à l'instruction des objets pour vos classes de scénario, pas d'instances spécifiques d'eux. Le REPL devrait déjà avoir fourni la dépréciation des avertissements à cause de cela.
La solution est d'ajouter quelques parenthèses:
et
ou, comme didierd l'indique, l'utilisation
case object
set
abstract
danstrait
est redondante. Car c'est redondant, alors je suppose que c'est inoffensif. Mais, est-il une raison particulière pour laquelle vous avez inclus ici, @Kevin?OriginalL'auteur Kevin Wright
Votre problème est avec la classe de cas de sans parenthèse (qui sont désormais obsolète). Une classe de cas implique la création d'un compagnon de l'objet. Lorsque vous écrivez des Résultats sans parenthèse, à la fois dans votre liste, et dans le filtrage, cela signifie que le compagnon de l'objet.
Vous pouvez essayer
C'est ce qui explique le comportement dans la deuxième partie. Comme Résultats, c'est le compagnon de l'objet,
Results.getClass()
n'est pas classOf[Résultats], qui est la classe de l'instance, mais l' (synthétique) de classe de la compagne de l'objet,Results$
Si un
case class
a pas de paramètres, la plupart du temps, cela signifie que les différentes instances ne peuvent pas être distingués les uns des autres, et vous devriez plutôt utiliser uncase object
. Sinon, mettre la parenthèse.Je ne savais pas qu'il était obsolète avant de vérifier sortOut dans le repl, savais juste que c'était dangereux. Je ne pouvais pas le trouver dans une liste de changse (quelques références dans la liste de diffusion et de stackoverflow.com/q/2254710/754787 sur StackOverflow). Notez cependant qu'il n'est pas un changement de langue, juste ajouté un avertissement (avec l'implication qu'il pourrait cesser d'être pris en charge dans l'avenir), mais le comportement était le même avant de l'autodérision.
OriginalL'auteur Didier Dupont