2010-09-03 4 views
40

Je me suis trouvé coincé sur quelque chose de trivial: -]Comment utiliser switch/case (correspondance de motif simple) dans Scala?

J'ai un ENUM:

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

Dans un code que je dois le convertir sous condition à un certain nombre (varianr numéro la correspondance diffère selon le contexte). Je vous écris:

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

Et cela me donne un « code injoignable » erreur du compilateur pour chaque branche, mais quel que soit le premier (« cas FOO => 4 » dans ce cas). Qu'est-ce que je fais mal?

+0

Je pense que "en" est "val" et attribué à "BAR". Il ne peut pas être réaffecté plus tard, c'est donc égal à BAR n'importe où après une telle déclaration. – Wildcat

+0

C'est un exemple simplifié, dans le vrai programme "en" est l'argument d'entrée d'une fonction. Il ne peut en effet pas être réaffecté à l'intérieur, mais peut différer d'appel à appel. – Ivan

+2

Dans ce cas, peut-être pourriez-vous donner un exemple moins simplifié? En l'état, la réponse est que cela donne une erreur de "code inaccessible" parce qu'il y a du code inaccessible. –

Répondre

53

Je soupçonne que le code que vous utilisez réellement n'est pas FOO, mais foo, minuscule, ce qui provoquera Scala juste assigner la valeur à foo, au lieu de 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 
} 
+0

Merci. Et que puis-je faire pour utiliser des valeurs enum minuscules? – Ivan

+0

@Ivan: Mettez-les à l'intérieur des guirlandes comme indiqué dans son troisième exemple. – missingfaktor

5

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)) 
    } 
} 

Pouvez-vous dire comment cela diffère de votre problème s'il vous plaît?

+0

Dans mon code réel, je dois utiliser des minuscules. Daniel dit que c'est le problème. Je ne pourrais jamais supposer que cela puisse avoir de l'importance. – Ivan

+0

@ pagoda_5b Le lien 2ns est mort. Quelqu'un l'a-t-il récupéré quelque part? –

+0

@ Arioch'Le désolé pour le chaînon manquant. Je suppose que le sujet a été considéré trop générique pour le format SO. Je n'ai pas de substitut pour le moment. –

Questions connexes