1

我正在尝试在 Scala 列表上进行模式匹配,如果所需类型的对象包含在列表中的任何位置,则该模式将匹配。

我试过:

case _ :: (something: DesiredSubclass) :: _ => ???

但这仅在我要查找的元素之前至少有一个元素时才匹配。

4

3 回答 3

4

使用if警卫和exists高阶方法。

case xs if xs.exists(_.isInstanceOf[DesiredSubclass]) => ???
于 2013-01-25T17:29:57.757 回答
4

公开使用isInstanceOf[SomeType]是不雅观的。最好使用match-likePartialFunction文字表示法:

list.exists { case _: DesiredSubclass => true; case _ => false }
于 2013-01-25T17:34:11.343 回答
1

模式匹配不能用于进行这样的任意搜索。你可以

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
于 2013-01-25T17:40:35.633 回答