目的のタイプのオブジェクトがリスト内のどこかに含まれている場合に一致するパターンを使用して、Scala リストでパターン一致を試みています。
私は試した:
case _ :: (something: DesiredSubclass) :: _ => ???
しかし、これは、探している要素の前に少なくとも 1 つの要素がある場合にのみ一致します。
目的のタイプのオブジェクトがリスト内のどこかに含まれている場合に一致するパターンを使用して、Scala リストでパターン一致を試みています。
私は試した:
case _ :: (something: DesiredSubclass) :: _ => ???
しかし、これは、探している要素の前に少なくとも 1 つの要素がある場合にのみ一致します。
高次の方法if
と一緒にガードを使用します。exists
case xs if xs.exists(_.isInstanceOf[DesiredSubclass]) => ???
オバートの使用isInstanceOf[SomeType]
は見苦しいです。match
-likeのPartialFunction
リテラル表記を使用することをお勧めします。
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