如何在Scala中使用switch / case(简单模式匹配)?

时间:2010-09-03 19:54:23

标签: scala pattern-matching switch-statement

我发现自己陷入了一件非常微不足道的事情: - ]

我有一个枚举:

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

在代码中,我必须将其有条件地转换为数字(varianr-number对应关系因上下文而异)。我写道:

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

这给了我每个分支的“无法访问的代码”编译器错误,但无论第一个是什么(在这种情况下“情况FOO => 4”)。我做错了什么?

2 个答案:

答案 0 :(得分:58)

我怀疑您实际使用的代码不是FOO,而是foo,小写,这会导致Scala只将值分配给foo,而不是将值与它

换句话说:

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
}

答案 1 :(得分:5)

以下代码适用于我:它产生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))
    }
}

你能说出这与你的问题有什么不同吗?