我正在尝试在 Scala 列表上进行模式匹配,如果所需类型的对象包含在列表中的任何位置,则该模式将匹配。
我试过:
case _ :: (something: DesiredSubclass) :: _ => ???
但这仅在我要查找的元素之前至少有一个元素时才匹配。
我正在尝试在 Scala 列表上进行模式匹配,如果所需类型的对象包含在列表中的任何位置,则该模式将匹配。
我试过:
case _ :: (something: DesiredSubclass) :: _ => ???
但这仅在我要查找的元素之前至少有一个元素时才匹配。
使用if
警卫和exists
高阶方法。
case xs if xs.exists(_.isInstanceOf[DesiredSubclass]) => ???
公开使用isInstanceOf[SomeType]
是不雅观的。最好使用match
-likePartialFunction
文字表示法:
list.exists { case _: DesiredSubclass => true; case _ => false }
模式匹配不能用于进行这样的任意搜索。你可以
list.collect{ case something: DesiredSubclass => something }.headOption
获得包含该项目的选项。您不能在 match 语句中分配它,但如果获取该特定类真的很重要,您可以编写一个自定义提取器:
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