如何使用较小案例 class 的所有属性实例化 Scala 案例 class?
How do I instantiate a Scala case class using all the attributes of a smaller case class?
我有一个案例class答:
case class A(
foo: String,
bar: String,
baz: String
)
val a = A("a", "b", "c")
我想用它来创建案例 class 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 个参数,所以用显而易见的方法来做是非常冗长的。
我相信 henkan 完全符合您的要求。
import henkan.convert.Syntax._
val b:B = A("a", "b", "c").to[B].set(qux = "d", quux = "e")
Henkan 在后台使用 shapeless,因此您也可以使用它来编写自己的解决方案。
您可以定义一个或多个隐式转换。
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)
首先,具有 20 个参数的 case class
通常是糟糕设计的标志,因此请考虑将这些参数分组为更小的 classes,然后将它们放在一个容器中 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")
我有一个案例class答:
case class A(
foo: String,
bar: String,
baz: String
)
val a = A("a", "b", "c")
我想用它来创建案例 class 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 个参数,所以用显而易见的方法来做是非常冗长的。
我相信 henkan 完全符合您的要求。
import henkan.convert.Syntax._
val b:B = A("a", "b", "c").to[B].set(qux = "d", quux = "e")
Henkan 在后台使用 shapeless,因此您也可以使用它来编写自己的解决方案。
您可以定义一个或多个隐式转换。
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)
首先,具有 20 个参数的 case class
通常是糟糕设计的标志,因此请考虑将这些参数分组为更小的 classes,然后将它们放在一个容器中 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")