【问题标题】:Scala case class arguments instantiation from arrayScala案例类参数从数组实例化
【发布时间】:2014-04-10 06:41:27
【问题描述】:

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

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

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

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

然后

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

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

【问题讨论】:

    标签: arrays class scala instantiation shapeless


    【解决方案1】:

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

    你可以使用元组。

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

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

    那么你可以这样做:

    c.tupled(t)
    

    【讨论】:

    • 非常感谢,有用的信息。
    • 在所有答案之后记下一个解决方案。
    • 这应该是公认的答案。除了问题作者是接受自己答案的同一个人之外,不确定为什么上面的答案是公认的答案而不是这个答案。显然,OP 对依赖于 Shapeless 库的答案感兴趣,但 OP 中没有提到 Shapeless,它只是出现在标签中。更重要的是,正如这个答案所示,Shapeless 不是必需的。
    【解决方案2】:

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

    一旦你有了一个元组,serejja 的回答就会带你到c

    请注意,按照惯例,我们会将c 拼写为大写C

    【讨论】:

    • 在所有答案之后记下一个解决方案。
    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      相关资源
      最近更新 更多