Valores enumerados parecen fallar en un partido/expresiones case. Esto es lo que sucede en una hoja de cálculo.

  object EnumType extends Enumeration {
    type EnumType = Value
    val a, b = Value
  }

  import EnumType._
  val x: EnumType = b                //> x : ... .EnumType.EnumType = b

  x match {
    case a => "a"
    case b => "b"
  }                                  //> res0: String = a

  if (x == a) "a" else "b"           //> res1: String = b

¿Qué está pasando? Gracias.

Usted debería haber recibido una advertencia de que la 2ª case nunca puede coincidir, ¿verdad?
El mismo código en un .scala archivo produce una advertencia, pero no en una hoja de cálculo.

OriginalEl autor RussAbbott | 2014-01-28

3 Comentarios

  1. 20

    Como @Kevin Wright y @Lee dijo, a y b trabajo como variable de patrones, no como EnumType valores.

    Otra opción para corregir el código se hace explícito que se hace referencia a los valores de la EnumType singleton:

    scala> x match { case EnumType.a => "a" case EnumType.b => "b" }
    res2: String = b
    Gracias. Esto también funciona.

    OriginalEl autor rsenna

  2. 8

    La a y b en su match bloque no son los mismos que los valores enumerados a y b, el patrón comparador simplemente coincidir x en el primer caso y se unen a un nuevo valor a (el segundo caso se omitirá)

    Para evitar esto, usted tiene dos opciones:

    1) ajuste los valores en comillas simples inclinadas:

    x match {
      case `a` => "a"
      case `b` => "b"
    }     

    2) Hacer que los valores enumerados en mayúsculas:

    object EnumType extends Enumeration {
      type EnumType = Value
      val A, B = Value
    }
    
    import EnumType._
    val x: EnumType = B
    
    x match {
      case A => "a"
      case B => "b"
    }   

    Dado que estos valores son (a todos los efectos una) constantes, el uso de mayúsculas es el más común/idiomáticas solución.

    Tenga en cuenta que sólo la primera letra debe ser mayúscula, no en el nombre del todo literal.

    Gracias. Yo no era consciente de la parte Superior de la caja o el acento grave convenio para el caso de las declaraciones. (PS. He comprobado la marca de verificación indica que la pregunta fue respondida, pero cuando me registré la marca en la respuesta anterior, esta respuesta se convirtió en desactivada.)
    Siéntase libre de aceptar lo que las rocas de su barco más 🙂 por cierto, siempre se puede cambiar aceptado la respuesta si algo que viene que creo que es un mejor ajuste de la pregunta.
    Me gustaría ir también con haciéndolos mayúsculas de todos modos, respeta la convención de nomenclatura y también que no será tratado como un patrón de valores en la coincidencia de patrón

    OriginalEl autor Kevin Wright

  3. 1

    a en su caso declaración es una variable independiente que coincide con nada. Usted necesita comprobar explícitamente el valor es igual a a:

    x match {
        case v if v == a => "a"
        case _ => "b"
    }
    Este es esencialmente el mismo que el si-versión de expresión.
    Ver las otras dos respuestas que, de hecho, explicar por qué sucede

    OriginalEl autor Lee

Dejar respuesta

Please enter your comment!
Please enter your name here