Как использовать переключатель/футляр (простое совпадение с образцом) в 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" в этом случае). Что я делаю неправильно?
Ответы
Ответ 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))
}
}
Не могли бы вы сказать, как это отличается от вашей проблемы?