web-dev-qa-db-fra.com

Comment utiliser switch / case (simple pattern matching) dans Scala?

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

J'ai une énumération:

 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 des nombres variés 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 de compilation "code inaccessible" pour chaque branche mais quelle que soit la première ("case FOO => 4" dans ce cas). Qu'est-ce que je fais mal?

43
Ivan

Je soupçonne que le code que vous utilisez n'est pas FOO, mais foo, en minuscules, ce qui entraînera Scala pour simplement affecter la valeur à foo, au lieu de lui comparer la valeur.

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
}
59
Daniel C. Sobral

Le code suivant fonctionne 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?

5
Matthew Farwell