2010-09-03 10 views
40

me he encontrado atrapado en una cosa muy trivial: -]¿Cómo usar el interruptor/caja (coincidencia de patrón simple) en Scala?

Tengo una enumeración:

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

En un código que tengo para convertirlo condicionalmente a un número (número varianr la correspondencia difiere según el contexto). Escribo:

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

Y esto me da un "código inalcanzable" error del compilador para cada rama, pero cualquiera que sea el primero ("caso FOO => 4" en este caso). ¿Qué estoy haciendo mal?

+0

Mi conjetura es que "es" es "val" y se asigna a "BAR". No se puede reasignar más tarde, por lo que es igual a BAR en cualquier lugar después de dicha declaración. – Wildcat

+0

Es un ejemplo simplificado, en el programa real "en" es el argumento de entrada de una función. De hecho, no se puede reasignar dentro, pero puede diferir de llamada a llamada. – Ivan

+2

En ese caso, ¿quizás podrías dar un ejemplo menos simplificado? Tal como está, la respuesta es que da un error de "código inalcanzable" porque hay un código inalcanzable. –

Respuesta

53

sospecho que el código que está utilizando realmente no es FOO, pero foo, minúsculas, lo que provocará Scala simplemente asignar el valor a foo, en lugar de comparar el valor a la misma.

En otras palabras:

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

Gracias. ¿Y qué puedo hacer para usar valores enum minúsculos? – Ivan

+0

@Ivan: Póngalos dentro de los backticks como se muestra en su tercer ejemplo. – missingfaktor

5

el siguiente código funciona bien para mí: produce 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)) 
    } 
} 

puedes decir en qué se diferencia de su problema por favor?

+0

En mi código real, tengo que usar minúsculas. Daniel dice que este es el problema. Nunca podría suponer que esto puede importar. – Ivan

+0

@ pagoda_5b El enlace 2ns está muerto. ¿Alguien lo rescató en alguna parte? –

+0

@ Arioch 'Lo siento por el eslabón perdido. Supongo que el tema se consideró demasiado genérico para el formato SO. No tengo sustituto en este momento. –

Cuestiones relacionadas