Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';Scala中最惯用的方式是在包含转换为字符串的枚举值的Seq上进行模式匹配吗?_Scala_Functional Programming_Switch Statement_Scala Collections - Fatal编程技术网

什么';Scala中最惯用的方式是在包含转换为字符串的枚举值的Seq上进行模式匹配吗?

什么';Scala中最惯用的方式是在包含转换为字符串的枚举值的Seq上进行模式匹配吗?,scala,functional-programming,switch-statement,scala-collections,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

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

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

首先将其映射回enum:

import scala.util.Try

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

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

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

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

您不能在模式中应用任何函数(那里有
.toString
)。您想知道
Seq()
的所有元素是
Foo
值字符串,还是仅仅是其中的任何一个?您是否需要报告哪些元素匹配,或者它只是布尔值(即找到匹配/未找到匹配)?@cchantep将其钉在头部,我应该在
case Seq(Foo.ONE)
上进行匹配。谢谢大家的投入!