Scala中最常用的方式是在Seq上将模式匹配保持转换为字符串的枚举值吗?

时间:2017-02-06 21:54:36

标签: scala functional-programming switch-statement scala-collections

我试图匹配转换为集合中保存的字符串的枚举值。这是代码:

object Foo extends Enumeration {
    val ONE = Value("ONE")
    val TWO = Value("TWO")
}

def check(seq: Seq[String]): Unit = seq match {
    case Seq(Foo.ONE.toString) => println("match")
    case _ => println("no match")
}

这会导致编译错误:

error: stable identifier required, but Foo.ONE.toString found.
           case Seq(Foo.ONE.toString) => println("match")

使用我的Foo枚举值作为模式匹配case语句的元素的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

首先将其映射回枚举:

import scala.util.Try

val enumSeq = seq map (x => Try(Foo.withName(x)))

然后,您可以过滤掉Failure或匹配Seq(Success(ONE))Seq(Success(ONE)),...,Seq(Failure)等。

答案 1 :(得分:1)

def check(seq: Seq[String]): Unit = seq match {
  case Seq(s @ _) if s == Foo.ONE.toString => println("match")
  case _ => println("no match")
}

答案 2 :(得分:1)

我喜欢@cchantep的回复,这是为了避免在模式匹配中调用.toString并实现check方法,如下所示:

def check(seq: Seq[Foo.Value]): Unit = seq match {
  case Seq(Foo.ONE) => println("match")
  case _ => println("no match")
}