Вы можете сопоставить шаблон с этим синтаксисом в любом классе, если у вас есть объект с помощью метода unapply
или unapplySeq
(в случае varargs), который возвращает Option
или Boolean
. Они известны как экстракторы . Рассматриваемые строки из объекта Array
:
def unapplySeq[T](x: Array[T]): Option[IndexedSeq[T]] =
if (x == null) None else Some(x.toIndexedSeq)
В вашем примере вы можете получить его, используя
class A(val x: Int)
object A {
def unapply(a: A) = Some(a.x)
}
так что теперь
scala> new A(4) match { case A(x) => x }
res1: Int = 4
Программирование в Scala глава о экстракторах может быть полезна.
Для case-классов метод unapply
является лишь одним из методов, включенных бесплатно, наряду с toString
, equals
и т. Д.
Обратите внимание, что экстрактор не должен иметь того же имени, что и рассматриваемый класс, и его не нужно определять в объекте object
. Например, в вашем случае вы могли бы одинаково написать
val xyz = new { def unapply(a: A) = Some(a.x) } //extending java.lang.Object
new A(4) match { case xyz(x) => x } //Int = 4