考虑一个可能有大量成员的案例类;以示出的情况下承担两个参数,如在来自数组的斯卡拉案例类参数实例化
case class C(s1: String, s2: String)
,并因此假设与至少许多参数大小的阵列,
val a = Array("a1", "a2")
然后
scala> C(a(0), a(1))
res9: C = c(a1,a2)
然而,是否有一种案例类实例化的方法,其中不需要为数组中的每个元素引用任何(可能很多)预定义的类成员?
考虑一个可能有大量成员的案例类;以示出的情况下承担两个参数,如在来自数组的斯卡拉案例类参数实例化
case class C(s1: String, s2: String)
,并因此假设与至少许多参数大小的阵列,
val a = Array("a1", "a2")
然后
scala> C(a(0), a(1))
res9: C = c(a1,a2)
然而,是否有一种案例类实例化的方法,其中不需要为数组中的每个元素引用任何(可能很多)预定义的类成员?
具有不同于其他答案收集点点滴滴,使用Shapeless 2.0.0因此,如下的解决方案,
import shapeless._
import HList._
import syntax.std.traversable._
val a = List("a1", 2) // List[Any]
val aa = a.toHList[String::Int::HNil]
val aaa = aa.get.tupled // (String, Int)
然后我们就可以实例化一个给定的情况下,类
case class C(val s1: String, val i2: Int)
val ins = C.tupled(aaa)
等
scala> ins.s1
res10: String = a1
scala> ins.i2
res11: Int = 2
型号签名在编译时已知与案例类成员要实例化的类型一样多。
不,你不能。你不能保证你的数组大小至少是你的案例类的成员数。
尽管你可以使用元组。
假设你有提到过的案例类和看起来像这样一个元组:
val t = ("a1", "a2")
然后,你可以这样做:
c.tupled(t)
要一个序列转换成一个元组看到这样的回答:https://stackoverflow.com/a/14727987/2483228
一旦你有一个元组serejja的答案会让你到c
。
请注意,约定会让我们拼写c
,首字母为C
。
许多感谢,有用的信息。 – elm
请注意遵循所有答案的解决方案。 – elm
这应该是被接受的答案。除了问题作者是接受自己答案的同一个人之外,不知道为什么上面的答案是被接受的答案,而不是这个答案。显然,OP对依赖Shapeless库的答案感兴趣,但Shapeless在OP中没有提及,它只出现在标签中。更重要的是,正如这个答案所示,无形是没有必要的。 – doug