2014-03-07 48 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