2014-03-07 190 views
4

考虑一个可能有大量成员的案例类;以示出的情况下承担两个参数,如在来自数组的斯卡拉案例类参数实例化

case class C(s1: String, s2: String) 

,并因此假设与至少许多参数大小的阵列,

val a = Array("a1", "a2") 

然后

scala> C(a(0), a(1)) 
res9: C = c(a1,a2) 

然而,是否有一种案例类实例化的方法,其中不需要为数组中的每个元素引用任何(可能很多)预定义的类成员?

回答

3

具有不同于其他答案收集点点滴滴,使用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 

型号签名在编译时已知与案例类成员要实例化的类型一样多。

5

不,你不能。你不能保证你的数组大小至少是你的案例类的成员数。

尽管你可以使用元组。

假设你有提到过的案例类和看起来像这样一个元组:

val t = ("a1", "a2") 

然后,你可以这样做:

c.tupled(t) 
+0

许多感谢,有用的信息。 – elm

+0

请注意遵循所有答案的解决方案。 – elm

+1

这应该是被接受的答案。除了问题作者是接受自己答案的同一个人之外,不知道为什么上面的答案是被接受的答案,而不是这个答案。显然,OP对依赖Shapeless库的答案感兴趣,但Shapeless在OP中没有提及,它只出现在标签中。更重要的是,正如这个答案所示,无形是没有必要的。 – doug

3

要一个序列转换成一个元组看到这样的回答:https://stackoverflow.com/a/14727987/2483228

一旦你有一个元组serejja的答案会让你到c

请注意,约定会让我们拼写c,首字母为C

+0

非常感谢,无形心:) – elm

+0

注意所有答案后的解决方案。 – elm