枚举值似乎在匹配/案例表达式中失败。这就是工作表中的情况。
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
发生了什么事?感谢。
答案 0 :(得分:20)
就像@Kevin Wright和@Lee刚才说的那样,a
和b
可以作为变量模式,而不是EnumType
值。
修复代码的另一个选择是明确表示您引用EnumType
单例的值:
scala> x match { case EnumType.a => "a" case EnumType.b => "b" }
res2: String = b
答案 1 :(得分:8)
a
块中的b
和match
与枚举值a
和b
不同,模式匹配器只会匹配在第一种情况下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)
a
是一个与任何东西匹配的未绑定变量。您需要明确检查值是否等于a
:
x match {
case v if v == a => "a"
case _ => "b"
}