考虑一个可能有大量成员的案例类;为了说明这种情况,假设有两个参数,如
case class C(s1: String, s2: String)
因此假设一个大小至少为那么多参数的数组,
val a = Array("a1", "a2")
然后
scala> C(a(0), a(1))
res9: C = c(a1,a2)
但是,是否存在一种案例类实例化的方法,其中不需要为数组中的每个元素引用任何(可能是大的)预定义类成员?
答案 0 :(得分:6)
你可以使用元组。
假设您有一个提到的案例类和一个如下所示的元组:
val t = ("a1", "a2")
然后你可以这样做:
c.tupled(t)
答案 1 :(得分: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类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
的类型签名在编译时已知与要实例化的案例类成员类型一样多。
答案 2 :(得分:3)
要将Seq转换为元组,请参阅以下答案:https://stackoverflow.com/a/14727987/2483228
一旦你有了一个元组serejja的回答就会让你到c
。
请注意,约定会让我们使用大写c
拼写C
。