如何在 Scala 中使用 switch/case(简单模式匹配)?

Posted

技术标签:

【中文标题】如何在 Scala 中使用 switch/case(简单模式匹配)?【英文标题】:How to use switch/case (simple pattern matching) in Scala? 【发布时间】: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 - 发布您的实际代码!我怀疑你很快就会得到解决方案! 【参考方案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 格式来说太笼统了。我目前没有替代品。

以上是关于如何在 Scala 中使用 switch/case(简单模式匹配)?的主要内容,如果未能解决你的问题,请参考以下文章

C语言switch case后如何执行多条命令

javascript:在switch case中使用条件

Swift如何更灵活的使用switch...case操作符

Swift如何更灵活的使用switch...case操作符

在 Swift 的 switch / case 函数中使用数组

在java中输入退出选择之前,我如何继续在switch case中进行选择[重复]