Реализация класса для сопоставления с образцом - PullRequest
5 голосов
/ 25 мая 2010

Например,

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 => 
}

Ответы [ 2 ]

9 голосов
/ 25 мая 2010

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

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)
3 голосов
/ 25 мая 2010

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

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

...