На самом деле тот факт, что :: является case-классом, — это только половина ответа. Причина, по которой это работает при сопоставлении с образцом, заключается в том, что существует извлекатель для объекта ::, который генерируется автоматически при определении класса case. Удобно, что ::.unapply возвращает список, потому что :: расширяет список. Однако, если вы хотите использовать тот же прием для списков, вы не сможете расширить список, потому что он окончательный. Что вы можете сделать, так это определить объект с соответствующим методом unapply, который имеет ожидаемую сигнатуру возврата. Например, чтобы найти последний элемент списка, вы можете сделать следующее:
object ::> {def unapply[A] (l: List[A]) = Some( (l.init, l.last) )}
List(1, 2, 3) match {
case _ ::> last => println(last)
}
(1 to 9).toList match {
case List(1, 2, 3, 4, 5, 6, 7, 8) ::> 9 => "woah!"
}
(1 to 9).toList match {
case List(1, 2, 3, 4, 5, 6, 7) ::> 8 ::> 9 => "w00t!"
}
Экстрактор должен вернуть Option, который содержит кортеж из двух деконструированных элементов.
person
vdichev
schedule
06.10.2009