10
votes

Comment prévenir ce genre de bug - motif correspondant et nil

Lorsque vous rencontrez à nouveau la correspondance des listes, vous pouvez utiliser NIL pour vérifier la liste de vide. Cependant, si le type sous-jacent est un iérien, vous pouvez toujours vérifier nul, et il se cassera pour des ensembles vides, etc ... Voir la suite suivante Session:

scala> val l: Iterable[Int] = List()
l: Iterable[Int] = List()

scala> l match {
     | case Nil => 1
     | case _ => 2
     | }
res0: Int = 1

scala> val l: Iterable[Int] = Set() 
l: Iterable[Int] = Set()

scala> l match {
     | case Nil => 1
     | case _ => 2
     | }
res2: Int = 2


1 commentaires

Le sous-typing est une épée à double tranchant; utiliser avec soin.


3 Réponses :


12
votes

Une possibilité est d'utiliser une protection: xxx

Une autre façon de le faire consiste à utiliser une expression IF-else (fonctionne mieux si vous n'avez qu'une ou deux conditions de contrôle) : xxx


2 commentaires

Le si sinon est comme ça que j'ai fini par faire. Semble juste pas comme idiomatique.


IMHO la meilleure façon pour les collections correspondantes de motif



8
votes

Convertissez le scrutateur en une liste pour éliminer le doute.

l.toList match {
  case Nil => 1
  case xs  => 2
}


2 commentaires

Ouais. .toseq est également suffisant. (Vector (): SEQ [INT]) Match {cas nil => 0} .


Mais cela repose uniquement sur le fait que nil.equals est remplacé afin que nil soit égal à n'importe quel SEQ vide. Ceci est sans papiers, donc je ne fierais pas dessus (tellement mieux utiliser tolist sur toseq comme dans votre réponse, cela implique moins de magie).



1
votes

Voici une autre option (jeu de mots):

scala> val l: Iterable[Int] = List()
l: Iterable[Int] = List()

scala> l.headOption match { case None => 1; case Some(h) => 2 }
res0: Int = 1


0 commentaires