45 votes

Comment utiliser switch / case (correspondance de motif simple) dans Scala?

Je me suis retrouvé coincé sur une chose très triviale: -]

J'ai un enum:



object Eny extends Enumeration {
  type Eny = Value
  val FOO, BAR, WOOZLE, DOOZLE = Value
}
 

Dans un code, je dois le convertir conditionnellement en un nombre (la correspondance de nombre de variables varie selon le contexte). J'écris:



val en = BAR
val num = en match {
  case FOO => 4
  case BAR => 5
  case WOOZLE => 6
  case DOOZLE => 7
}
 

Et cela me donne une erreur du compilateur "code inaccessible" pour chaque branche mais whatewer est la première ("case FOO => 4" dans ce cas). Qu'est-ce que je fais mal?

61voto

Daniel C. Sobral Points 159554

Je suppose que le code que vous utilisez réellement n'est pas FOO , mais foo , en minuscule, ce qui obligera Scala à simplement attribuer la valeur à foo , au lieu de comparer la valeur à elle.

En d'autres termes:

 x match {
  case A => // compare x to A, because of the uppercase
  case b => // assign x to b
  case `b` => // compare x to b, because of the backtick
}
 

5voto

Matthew Farwell Points 31257

Le code suivant fonctionne très bien pour moi: il produit 6

 object Eny extends Enumeration {
  type Eny = Value
  val FOO, BAR, WOOZLE, DOOZLE = Value
}

import Eny._

class EnumTest {
    def doit(en: Eny) = {
        val num = en match {
          case FOO => 4
          case BAR => 5
          case WOOZLE => 6
          case DOOZLE => 7
        }       

        num
    }
}

object EnumTest {
    def main(args: Array[String]) = {
        println("" + new EnumTest().doit(WOOZLE))
    }
}
 

Pourriez-vous dire en quoi cela diffère de votre problème s'il vous plaît?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X