我正在尝试在Scala列表上模式匹配模式,如果所需类型的对象包含在列表中的任何位置,该模式将匹配。
我试过了:
case _ :: (something: DesiredSubclass) :: _ => ???
但是,只有在我正在寻找的元素之前至少有一个元素时才会匹配。
答案 0 :(得分:4)
使用if
警卫以及exists
更高阶的方法。
case xs if xs.exists(_.isInstanceOf[DesiredSubclass]) => ???
答案 1 :(得分:4)
使用公开的isInstanceOf[SomeType]
是不雅观的。最好使用match
- 类PartialFunction
字面符号:
list.exists { case _: DesiredSubclass => true; case _ => false }
答案 2 :(得分:1)
模式匹配不能用于进行任意搜索。你可以
list.collect{ case something: DesiredSubclass => something }.headOption
获取其中的项目选项。你不能在匹配语句中指定它,但如果获得该特定类非常重要,你可以编写一个自定义提取器:
class DesiredSubclass(val s: String) {}
object FirstOfDesired {
def unapply[A](xs: Seq[A]) = xs.collect{ case x: DesiredSubclass => x }.headOption
}
现在,例如:
val list = 7 :: (new DesiredSubclass("fish")) :: Nil
scala> list match { case FirstOfDesired(ds) => println(ds.s); case _ => }
fish