Scala枚举类型在匹配/大小写中失败

时间:2014-01-28 17:12:09

标签: scala enumeration

枚举值似乎在匹配/案例表达式中失败。这就是工作表中的情况。

  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

发生了什么事?感谢。

3 个答案:

答案 0 :(得分:20)

就像@Kevin Wright和@Lee刚才说的那样,ab可以作为变量模式,而不是EnumType值。

修复代码的另一个选择是明确表示您引用EnumType单例的值:

scala> x match { case EnumType.a => "a" case EnumType.b => "b" }
res2: String = b

答案 1 :(得分:8)

a块中的bmatch与枚举值ab不同,模式匹配器只会匹配在第一种情况下x并将其绑定到新值a(第二种情况将被忽略)

为避免这种情况,您有两种选择:

1)将值包装在反引号中:

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

2)将枚举值设为大写:

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

鉴于这些值(以所有意图为目的)常量,使用大写是更常见/惯用的解决方案。

请注意,只有首字母必须是大写字母,而不是整个文字的名称。

答案 2 :(得分:1)

你的case语句中的

a是一个与任何东西匹配的未绑定变量。您需要明确检查值是否等于a

x match {
    case v if v == a => "a"
    case _ => "b"
}