Как распаковать родительский объект в расширенный дочерний конструктор?

#scala

Вопрос:

Я ищу, чтобы поместить объект в конструктор, который принимает все пары в этом объекте.

 case class Cat(name: String) 
case class PetPersian(name: String, price: Number) 

val c1 = Cat(name = "Meowth")

val c2 = PetPersian( 
  c1, // this is what I am trying to reuse.
  price = 10000
)


 

Комментарии:

1. Невозможно из коробки, есть некоторые хитрости, чтобы сделать что-то похожее на работу с помощью бесформенного или монокля . Но я лично предпочел бы использовать класс case напрямую, а не повторять поля.

Ответ №1:

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

 object PetPersian {
   def apply(cat: Cat, price: Number): PetPersian = PetPersian(cat.name, price)
}
 

Если в конструкторе необходимо принять несколько различных типов, объявите общий trait для этих типов или используйте класс типов.

Если вы хотите заставить его работать с любым объектом с name полем, это можно сделать, используя структурный тип, который имеет проблемы с производительностью и другие проблемы и не рекомендуется.

 object PetPersian {
   def apply(n: { def name: String }, price: Number): PetPersian = PetPersian(n.name, price)
}