2015-07-28 16 views
6

İki farklı durum sınıfının alanlarını tek bir vaka sınıfında birleştirmek istiyorum. Aşağıdaki vaka sınıfları varsa, örneğinİki farklı durum sınıfının alanlarını birleştirmek için şekilsiz scala kullanma

:

TestWithAnswers(name:String, questions:List[Question], date:DateTime, answers:List[Answer]). 

orada güzel bir şekilsiz bir cevabı var mı:

case class Test(name:String, questions:List[Question], date:DateTime) 

case class Answer(answers:List[Answers]) 

bir özlü şekilsiz yolu hem birleştirmek istediğiniz?

cevap

10

Bunu yapmak için shapeless Generic kullanabilirsiniz. Eğer t Sağlanan biri gömlekleri

val ta = Generic[TestWithAnswers].from(Generic[Test].to(t) ++ Generic[Answer].to(a)) 

karşı bir şeyler varsa

val t: Test = ??? 
val a: Answer = ??? 
val gt = Generic[Test] 
val ga = Generic[Answer] 
val gta = Generic[TestWithAnswers] 

val ta = gta.from(gt.to(t) ++ ga.to(a)) 

veya iyi, Test ve a örneğidir Answer örneğidir olduğu, taTestWithAnswers bir örneği olur.

Hızlı bir açıklama: Generic, bir vaka sınıfını genel bir HList gösterimine dönüştürebilir. Dolayısıyla, sınıflarınızın yapısı göz önüne alındığında, hem testi hem de yanıtı bir hlist'e dönüştürebilir, iki listeyi tek bir listeye birleştirebilir ve bundan bir TestWithAnswers örneği oluşturabilirsiniz.

Burada bir repl içinde kopyalama yapıştırma ve deneyebilirsiniz daha basit bir örnek, var

import shapeless._ 
case class A(a: Int) 
case class B(a: String) 
case class AB(a: Int, b: String) 
Generic[AB].from(Generic[A].to(A(42)) ++ Generic[B].to(B("foo"))) 
// AB(42, "foo") 
+0

Şunu yapmak val ta = gta.from (gt.to (t) ++ at.to (a)) yerine val ta = gta.from (gt.to (t) ++ gt.to (a))? Bu değişikliği yaptığımda bile kod hala derlenmiyor. ++ operatörü gt.to (t) üyesi değil gibi görünüyor. Düşüncesi olan var mı? Teşekkürler – azuras

+0

Ayrıca Jenerik açıklama için teşekkürler. Çok yararlı. – azuras

+0

@azuras, evet bu yazım hatası zaten düzeltildi. Tüm şekilsiz ithal ettin mi? Kodu bir replde çalıştırdım ve –

İlgili konular