web-dev-qa-db-ja.com

パターンマッチを使用して、ScalaでnonEmptyリストを取得する方法

私は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]値を取得します

13
LoranceChen

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'
18
Shadowlands

リストが空でないかどうかを確認するには、次の方法でパターンマッチングを実行できます。

list match {
   case Nil => false
   case _ => true
}

または

list match {
  case Nil => false
  case x::xs => true  
}
16
Nyavro

空ではないリスト全体を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  
}
4
Visiedo

これが頻繁に使用するものである場合は、次のようなカスタムマッチャーを作成できます。

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)
2
thoredge