如何使用较小案例类的所有属性实例化Scala案例类?

问题描述 投票:1回答:3

我有一个案例类A的实例:

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

我想用它来创建案例类B的实例,其属性是A的超集:

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

[val b = (A.foo, A.bar, A.baz, "d", "e")还有比这更优雅的方法吗?我必须在代码中执行几次,并且我的实际用例有20个左右的参数,因此这样做显然很费劲。

scala class instantiation
3个回答
1
投票

我相信henkan确实可以满足您的要求。

import henkan.convert.Syntax._

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

Henkan在引擎盖下使用无定形,因此您也可以使用它来编写自己的解决方案。


0
投票

您可以定义一个或多个隐式转换。

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
投票

首先,带有20个参数的case class通常是不良设计的标志,因此请考虑将这些参数分组为较小的类,然后将它们放到容器类中。

如果保持这种设计并且不想使用外部库,则可以为B构造一个采用A加上额外参数的构造函数:

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")
© www.soinside.com 2019 - 2024. All rights reserved.