#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)
}