Scala 中最惯用的方式是在 Seq 上进行模式匹配,将枚举值转换为字符串?

What's the most idiomatic way in Scala to pattern match on a Seq holding enum values converted to strings?

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

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 语句的元素的正确方法是什么?

首先将其映射回枚举:

import scala.util.Try

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

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

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

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

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