2015-07-28 12 views
6

Desidero unire i campi di due diverse case-class in una singola classe di casi.Uso di scala senza forma per unire i campi di due case history diverse

Per esempio, se ho le seguenti classi case:

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

case class Answer(answers:List[Answers]) 

voglio un modo informe conciso per unire sia in:

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

C'è una risposta informe bello là fuori?

risposta

10

Per questo è possibile utilizzare senza forma Generic.

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)) 

o bene, se si dispone di una cosa per one-liners

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

forniti t è un esempio di Test e a è un'istanza di Answer, ta sarà un'istanza di TestWithAnswers.

Una spiegazione rapida: Generic può convertire una classe di casi in e da una rappresentazione generica HList. Quindi, data la struttura delle tue classi, puoi semplicemente convertire sia il test che la risposta in una hlist, concatenare i due elenchi in uno solo e creare un'istanza TestWithAnswers da esso.

Ecco un esempio più semplice, che è possibile copiare-incollare e provare in un REPL

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

vuoi dire val ta = gta.from (gt.to (t) ++ at.to (a)) invece di val ta = gta.from (gt.to (t) ++ gt.to (a))? Anche quando apporto questa modifica, il codice non viene ancora compilato. Sembra che l'operatore ++ non sia un membro di gt.to (t). qualche idea? Grazie – azuras

+0

Grazie anche per la spiegazione di Generic. Molto utile. – azuras

+0

@azuras, sì che l'errore è già stato corretto. Hai importato tutto informe? Ho eseguito il codice in un repl e ha funzionato –

Problemi correlati