【问题标题】:How to use switch/case (simple pattern matching) in Scala?如何在 Scala 中使用 switch/case(简单模式匹配)?
【发布时间】:2011-04-08 00:54:33
【问题描述】:

我发现自己陷入了一件非常琐碎的事情:-]

我有一个枚举:

 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
}

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

【问题讨论】:

  • 我的猜测是“en”是“val”并分配给“BAR”。以后不能重新分配,因此在声明后的任何地方都等于 BAR。
  • 这是一个简化的例子,在实际程序中“en”是一个函数的输入参数。它确实不能在内部重新分配,但可能因调用而异。
  • 在这种情况下,也许您可​​以举一个不太简单的例子?就目前而言,答案是它给出了“无法访问的代码”错误,因为存在无法访问的代码。
  • 我无法复制您报告的错误。我拿了你的代码,没有改变,把它放在一个对象中并编译它。你提交给 REPL 了吗?
  • @Ivan - 发布您的实际代码!我怀疑你很快就会得到解决方案!

标签: scala pattern-matching switch-statement


【解决方案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
}

【讨论】:

  • 谢谢。我该怎么做才能使用小写的枚举值?
  • @Ivan:将它们放在反引号中,如他的第三个示例所示。
【解决方案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))
    }
}

您能说说这与您的问题有何不同吗?

【讨论】:

  • 在我的真实代码中,我必须使用小写字母。丹尼尔说这就是问题所在。我永远不会认为这很重要。
  • @pagoda_5b 2ns 链接已失效。有人在某个地方打捞过它吗?
  • @Arioch'对于丢失的链接,我深表歉意。我想这个主题对于 SO 格式来说太笼统了。我目前没有替代品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2011-03-04
相关资源
最近更新 更多