私はcase x :: Nil => ...
を使用して、リストがnonEmptyであることを確認していますが、それは単一の要素リストに一致するだけです。パターンマッチを使用してnonEmptyリストを取得するにはどうすればよいですか?
[〜#〜]更新[〜#〜]
申し訳ありません、何かを失ったようです。マッチインナーを使用する特別なシーンがあります。
object AccountResult{
def unapply(account: AccountResult): Option[(String, List[String])] = ???
}
//ignore accountResult define please
accountResult match {
case AccountResult(_, x :: _) => ...
}
list [String](x :: _)の値がNilでないaccountResultを一致させるにはどうすればよいですか?次に、一致したList [String]値を取得します
Nil
で空のリストのみを指定する代わりに、任意のリストにできるものを指定します。例:
case x :: tail => ... // tail is a local variable just like x, holding the tail of the list
または単に:
case x :: _ => ...
しっぽを気にしない、または使わない場合。
これらのパターンは、少なくとも1つの要素(ではなく1つではなく、すべてのリストに一致します-)既存のパターンごとの要素)。同様に、パターン:
case x :: y :: the_rest => ...
少なくともの2つの要素を持つ任意のリストに一致します。
編集(コメントへの応答):
「@
」を使用して、ケースパターン内の変数に割り当てることができます。したがって、既に見たかもしれない(典型的な使用法)例については:
case acc@AccountResult(_, x :: tail) => ... // do something with 'acc'
または、コメントごとに求めている使用方法に一致させます。
case AccountResult(_, phone@(x :: tail)) => ... // do something with 'phone'
リストが空でないかどうかを確認するには、次の方法でパターンマッチングを実行できます。
list match {
case Nil => false
case _ => true
}
または
list match {
case Nil => false
case x::xs => true
}
空ではないリスト全体をvalに割り当てるだけで、ヘッドとテールを分割せずに、空のリストと一致するケースを追加し、次のようにリストを変数名に割り当てる別のケースを追加します。
accountResult match {
case List() => ??? // empty case
case myAccountResult => ??? //myAccountResult will contain the whole non-empty list
}
Nil
は、空のリストに一致する仕事も行います
accountResult match {
case Nil => ??? // empty case
case myAccountResult => ??? //myAccountResult will contain the whole non-empty list
}
これが頻繁に使用するものである場合は、次のようなカスタムマッチャーを作成できます。
object NonEmpty {
def unapply(l: List[_]) = l.headOption.map(_ => l)
}
これは次のように使用できます。
scala> List() match { case NonEmpty(l) => println(l) }
scala.MatchError: List() (of class scala.collection.immutable.Nil$)
... 33 elided
scala> List(43) match { case NonEmpty(l) => println(l) }
List(43)
scala> List(43, 32) match { case NonEmpty(l) => println(l) }
List(43, 32)