1
votes

Comment instancier une classe de cas Scala en utilisant tous les attributs d'une classe de cas plus petite?

J'ai une instance d'une classe de cas A:

case class B(
  foo: String,
  bar: String,
  baz: String,
  qux: String,
  quux: String
)

Je veux l'utiliser pour créer une instance d'une classe de cas B, avec des attributs qui sont un sur-ensemble de A: p>

case class A(
  foo: String,
  bar: String,
  baz: String
)
val a = A("a", "b", "c")

Y a-t-il une manière plus élégante de faire cela que val b = (A.foo, A.bar, A.baz, "d", "e") ? Je dois le faire plusieurs fois dans mon code, et mon cas d'utilisation actuel a quelque chose comme 20 paramètres, donc le faire de manière évidente est très long.


0 commentaires

3 Réponses :


1
votes

Je pense que henkan fait exactement ce que vous voulez.

import henkan.convert.Syntax._

val b:B = A("a", "b", "c").to[B].set(qux = "d", quux = "e")

Henkan utilise l'informe sous le capot, vous pouvez donc également l'utiliser pour écrire vos propres solutions.


0 commentaires

2
votes

Vous pouvez définir une ou plusieurs conversions implicites.

implicit class A2B(a:A) {
  def toB(x:String, y:String) :B = B(a.foo,a.bar,a.baz,x,y)
  //other conversion methods here
}

val a = A("a", "b", "c")  //a: A = A(a,b,c)
val b = a.toB("d", "e")   //b: B = B(a,b,c,d,e)


0 commentaires

3
votes

Premièrement, une classe de cas avec 20 paramètres est généralement un signe de mauvaise conception, alors pensez à regrouper ces paramètres dans des classes plus petites, puis à les rassembler dans une classe de conteneur.

Si vous gardez cette conception et ne voulez pas utiliser de bibliothèques externes, vous pouvez créer un constructeur pour B qui prend A plus les paramètres supplémentaires:

object B {
  def apply(a: A, qux: String, quux: String): B = B(a.foo, a.bar, a.baz, qux, quux)
}

val a:A = ???
val b = B(a, "qux", "quux")


0 commentaires