1

目的のタイプのオブジェクトがリスト内のどこかに含まれている場合に一致するパターンを使用して、Scala リストでパターン一致を試みています。

私は試した:

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

しかし、これは、探している要素の前に少なくとも 1 つの要素がある場合にのみ一致します。

4

3 に答える 3

4

高次の方法ifと一緒にガードを使用します。exists

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

オバートの使用isInstanceOf[SomeType]は見苦しいです。match-likeのPartialFunctionリテラル表記を使用することをお勧めします。

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 に答える