Scala模式匹配-匹配多个成功案例
我是Scala的新手,想知道Scala模式匹配-匹配多个成功案例,scala,pattern-matching,Scala,Pattern Matching,我是Scala的新手,想知道匹配是否可以同时执行多个匹配案例。在没有太多细节的情况下,我基本上是在开发一个函数,该函数根据不同的特征对某段文本进行“评分”;这些特征可以重叠,对于一个给定的字符串,多个特征可以是真的 为了说明我在代码中想要什么,它将如下所示: 假设我们有一个字符串,str,其值为“Hello World”。我想要一些大致如下的东西: str match { case i if !i.isEmpty => 2 case i if i.startsWith("w
匹配
是否可以同时执行多个匹配案例。在没有太多细节的情况下,我基本上是在开发一个函数,该函数根据不同的特征对某段文本进行“评分”;这些特征可以重叠,对于一个给定的字符串,多个特征可以是真的
为了说明我在代码中想要什么,它将如下所示:
假设我们有一个字符串,str
,其值为“Hello World”。我想要一些大致如下的东西:
str match {
case i if !i.isEmpty => 2
case i if i.startsWith("world") => 5
case i if i.contains("world") => 3
case _ => 0
}
我希望上面的代码触发第一个和第三个条件,有效地返回2和3(作为元组或以任何其他方式)
这可能吗
编辑:我知道这可以通过一系列的
if
来完成,这就是我所采取的方法。我只是好奇是否有类似于上述实现的可能。请考虑这个解决方案:
val matches = Map[Int, String => Boolean](2 -> {_.isEmpty}, 3 -> {_.contains("world")}, 5 -> {_.startsWith("world")})
val scores = matches.filter {case (k, v) => v(str)}.keys
您可以将
case
语句转换为函数
val isEmpty = (str: String) => if ( !str.isEmpty) 2 else 0
val startsWith = (str: String) => if ( str.startsWith("world")) 5 else 0
val isContains = (str: String) => if (str.toLowerCase.contains("world")) 3 else 0
val str = "Hello World"
val ret = List(isEmpty, startsWith, isContains).foldLeft(List.empty[Int])( ( a, b ) => a :+ b(str) )
ret.foreach(println)
//2
//0
//3
您可以使用filter
val ret0 = ret.filter( _ > 0)
ret0.foreach(println)
就我而言,模式匹配只适用于第一个正确的情况。@Haito是的。。。这就是为什么我想知道是否有什么我不熟悉的方法可以让这样的东西成功。这是不可能的。返回类型是什么?您可以使用类似于
List[(String=>Boolean,Int)]
的东西,然后使用predicateList.collect{case(p,i)if p(myWordToTest)=>i}
i最终执行了(!i.isEmpty)2::(if(i.startsWith(“world”))5:(if(i.contains(“world”))3::Nil)map{case i:Int=>i case=>0}sum
但想看看是否有更优雅的方式@Marth我本来希望返回类型可能是一个元组
,如果可能的话。