как использовать pattern match получить непустой список в scala?

Я использую case x :: Nil => ... попытайтесь убедиться, что список непустой, но он просто соответствует списку одного элемента.Как я могу использовать шаблон match получить непустой список?

обновлено
Извините, кажется, я что-то теряю, есть специальная сцена использовать матч внутренний,

object AccountResult{
  def unapply(account: AccountResult): Option[(String, List[String])] = ???
}

//ignore accountResult define please 
accountResult match {
  case AccountResult(_, x :: _) => ... 
}

Как я могу сопоставить accountResult, значение списка[String] (x :: _) не равно нулю? а затем получите сопоставленный список [String] value

4 ответов


вместо указания только пустого списка с Nil, укажите что-то, что может быть любым списком, например.:

case x :: tail => ... // tail is a local variable just like x, holding the tail of the list

или просто:

case x :: _ => ...

если вы не заботитесь о или не будет использовать хвост.

эти модели будут соответствовать любому списку с по крайней мере один элемент (а не ровно элемент согласно вашему существующему шаблону). Аналогично, шаблон:

case x :: y :: the_rest => ...

будет соответствовать любой список с at не менее два элемента.

редактировать (ответ на ваш комментарий):

вы можете назначить переменной в шаблоне case, используя "@". Итак, для (типичного использования) примера, который вы, возможно, уже видели:

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  
}

Если это то, что вы часто используете, вы можете создать пользовательский сопоставитель следующим образом:

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)

Если вы просто хотите назначить целый непустой список 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  
}