web-dev-qa-db-ja.com

Scalaでswitch / case(単純なパターンマッチング)を使用する方法は?

私は非常に些細なことにこだわっていることがわかりました:-]

私は列挙型を持っています:

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

コードでは、条件付きでそれを数値に変換する必要があります(変数番号の対応はコンテキストによって異なります)。私は書きます:

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

そして、これにより、最初のブランチ(この場合は「case FOO => 4」)以外のすべてのブランチに対して「到達不能コード」コンパイラエラーが発生します。何が間違っていますか?

43
Ivan

実際に使用しているコードは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
}
59

次のコードは私のためにうまく機能します: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))
    }
}

これがあなたの問題とどのように違うと言えますか?

5
Matthew Farwell