ti-enxame.com

Como usar switch / case (correspondência simples de padrões) no Scala?

Eu me vi preso a uma coisa muito trivial: -]

Eu tenho um enum:

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

Em um código, tenho que convertê-lo condicionalmente em um número (a correspondência varianr-number difere no contexto). Eu escrevo:

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

E isso me dá um erro de compilador "código inacessível" para cada ramificação, mas seja qual for o primeiro ("case FOO => 4" nesse caso). O que estou fazendo errado?

43
Ivan

Eu suspeito que o código que você está realmente usando não seja FOO, mas foo, em minúsculas, o que causará Scala apenas atribuir o valor a foo, em vez de comparar o valor a ele.

Em outras palavras:

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
Daniel C. Sobral

O código a seguir funciona bem para mim: produz 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))
    }
}

Você poderia dizer como isso difere do seu problema, por favor?

5
Matthew Farwell