2009-11-02 17 views
9

que estaba experimentando con argumentos de constructor de variables para las clases de casos en Scala, pero no puedo pasarlos al constructor del padre un caso de clases:pase número variable de argumentos en Scala (2,8) Clase caso al constructor padre

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

lo anterior no se compila ... ¿es realmente posible hacer esto?

+0

Seguro, no tuve tiempo de ver las respuestas antes. – p3t0r

+0

posible duplicado de [¿Cómo pasar la lista al método Int * en scala?] (Http://stackoverflow.com/questions/12436392/how-to-pass-list-to-int-method-in-scala) –

+0

I 'marcó una nueva pregunta como * pregunta de padre * porque es pedir caso general, no solo para las clases de caso –

Respuesta

7

Esto funciona con 2.7:

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

debe trabajar con 2.8.

+0

En realidad, la herencia de la clase de caso está destinada a ser rechazada. –

19

Es necesario utilizar la sintaxis :_* que significa "tratar esta secuencia como una secuencia de"! De lo contrario, su secuencia de n elementos se tratará como una secuencia de 1 elemento (que será su secuencia de n elementos).

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