Подтвердить что ты не робот

Как использовать переключатель/футляр (простое совпадение с образцом) в Scala?

Я обнаружил, что застрял в очень тривиальной вещи: -]

У меня есть перечисление:

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

В коде мне нужно условно преобразовать его в число (соответствие varianr-номера отличается от контекста). Я пишу:

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

И это дает мне ошибку компилятора "недостижимый код" для каждой ветки, но то, что является первым ( "случай FOO = > 4" в этом случае). Что я делаю неправильно?

4b9b3361

Ответ 1

Я подозреваю, что код, который вы на самом деле используете, не 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
}

Ответ 2

Следующий код работает отлично для меня: он создает 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))
    }
}

Не могли бы вы сказать, как это отличается от вашей проблемы?