5

考虑一个可能有大量成员的案例类;为了说明这种情况,假设有两个论点,如

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

因此假设一个数组的大小至少有那么多参数,

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

然后

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

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

4

3 回答 3

6

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

你可以使用元组。

假设您有一个提到的案例类和一个如下所示的元组:

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

然后你可以这样做:

c.tupled(t)
于 2014-03-07T08:08:49.203 回答
4

从其他答案中收集了一些零碎的信息,因此使用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

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

于 2014-03-07T14:03:48.037 回答
3

要将 Seq 转换为元组,请参阅此答案:https ://stackoverflow.com/a/14727987/2483228

一旦你有了一个元组 serejja 的答案,你就会得到一个c.

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

于 2014-03-07T12:20:42.560 回答