Классы дел не волшебны, то, что они делают под капотом, генерирует много шаблонного кода.
Между ними находятся apply
(конструктор фабрики) и unapply
(экстрактор) методов для сопутствующего объекта класса.
Когда вы пытаетесь сопоставить шаблон объекта, компилятор пытается вызвать метод экстрактора объекта-компаньона - таким образом, вам нужно всего лишь реализовать свой собственный объект экстрактора.
Например,
class User(val id: Int, val name: String)
object User {
def apply(id: Int, name: String): User = new User(id, name)
def unapply(user: User): Option[(Int, String)] =
Some(user.id, user.name)
}
Теперь вы можете создать соответствие пользователей таким образом.
val user = User(3, "Luis")
def getId(user: User): Int = user match {
case User(id, name) => id
}
getId(user) // 3
Для справки см. this .