Класс с реализацией для сопоставления с образцом

Например,

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 => 
}
5
задан Jeriho 25 May 2010 в 11:26
поделиться

2 ответа

В этом нет ничего особенного. Эти два утверждения эквивалентны:

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)
9
ответ дан 13 December 2019 в 05:31
поделиться

Если вы определяете свой класс как case class , он может быть сопоставлен с образцом следующим образом.

Если вы хотите сопоставить шаблон с чем-то другим, кроме конструктора класса, вы можете использовать экстракторы для определения пользовательских шаблонов.

3
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: