Например,
val list = List(1,2,3)
list match {
case a :: b =>
case _ =>
}
можно соответствовать голове и хвосту использования Списка ::
или маркеры использования ParseResult ~
. Что я должен сделать для создания класса, который может быть подобран как предыдущие классы?
UPD:
И имейте возможность записать:
case class @ ...
List(1,2,3,4) match {
case 1 @ 2 @ 3 @ 4 =>
}
В этом нет ничего особенного. Эти два утверждения эквивалентны:
case x :: xs =>
case ::(x, xs) =>
Допустим, вы хотите, чтобы что-то разделило список на чет и нечет, и назовите это **
. Вы можете написать экстрактор следующим образом:
object ** {
def unapply(xs: List[Int]) = Some(xs partition (_ % 2 == 0))
}
scala> List(1,2,3) match {
| case evens ** odds => println("Evens: "+evens+"\nOdds: "+odds)
| }
Evens: List(2)
Odds: List(1, 3)
Если вы определяете свой класс как case class , он может быть сопоставлен с образцом следующим образом.
Если вы хотите сопоставить шаблон с чем-то другим, кроме конструктора класса, вы можете использовать экстракторы для определения пользовательских шаблонов.