2009-11-02 12 views
9

mi stava sperimentando con argomenti del costruttore variabili per classi case a Scala, ma sono in grado di passare loro al costruttore del genitore un caso di classi:passaggio numero variabile di argomenti a Scala (2.8) caso di classe al costruttore genitore

abstract case class Node(val blocks: (Node => Option[Node])*) 
case class Root(val elementBlocks: (Node => Option[Node])*) extends Node(elementBlocks) 

quanto sopra non viene compilato ... è effettivamente possibile farlo?

+0

sicuro, non ho avuto il tempo di guardare le risposte in precedenza. – p3t0r

+0

possibile duplicato di [Come passare il metodo List a Int * in scala?] (Http://stackoverflow.com/questions/12436392/how-to-pass-list-to-int-method-in-scala) –

+0

I Ho contrassegnato una nuova domanda come * domanda parent * perché si tratta di un caso generale, non solo per le classi di casi –

risposta

7

Questo funziona con 2.7:

abstract case class A(val a: String*) 
case class B(val b: String*) extends A(b:_*) 

dovrebbe funzionare con 2.8.

+0

In realtà, l'ereditarietà della classe case è destinata ad essere non consentita. –

19

È necessario utilizzare il :_* sintassi che significa "trattare questa sequenza come una sequenza"! Altrimenti, la sequenza di n elementi sarà trattata come una sequenza di 1 elemento (che sarà la sequenza di n elementi).

def funcWhichTakesSeq(seq: Any*) = println(seq.length + ": " + seq) 

val seq = List(1, 2, 3) 
funcWhichTakesSeq(seq)  //1: Array(List(1, 2, 3)) -i.e. a Seq with one entry 
funcWhichTakesSeq(seq: _*) //3: List(1, 2, 3) 
Problemi correlati