На самом деле тот факт, что :: является классом case, - это только половина ответа. Причина, по которой это работает в сопоставлении с образцом, заключается в том, что для object :: существует extractor , который генерируется автоматически при определении класса case. Удобно, ::. Unapply возвращает список, потому что :: расширяет список. Если вы хотите использовать тот же трюк для списков, вы не сможете расширить список, потому что это final . Что вы можете сделать, это определить объект с помощью соответствующего неприменимого метода, который имеет ожидаемую подпись возврата. Например, чтобы соответствовать элементу last списка, вы можете сделать:
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, который содержит кортеж из двух деконструированных элементов.