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")
}
我正在尝试匹配转换为集合中保存的字符串的枚举值。这是代码:
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")
}