2009-11-02 11 views
9

Eksperymentowałem ze zmiennymi argumentami konstruktora dla klas przypadków w Scali, ale nie jestem w stanie przekazać ich do konstruktora klasy obiektów: "rodzic":Przekaż zmienną liczbę argumentów w scala (2.8) od klasy klasy do nadrzędnego konstruktora

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

powyższe nie kompiluje ... czy to rzeczywiście możliwe?

+0

z pewnością nie miał czasu, aby spojrzeć na odpowiedzi wcześniej. – p3t0r

+0

możliwy duplikat [Jak przekazać listę do metody Int * w scala?] (Http://stackoverflow.com/questions/12436392/how-to-pass-list-to-int-method-in-scala) –

+0

I "Oznaczono nowe pytanie jako * pytanie rodzica *, ponieważ jest ono pytaniem o ogólny przypadek, nie tylko dla klas przypadków: –

Odpowiedz

7

ten współpracuje z 2,7:

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

Powinna działać z 2.8.

+0

W rzeczywistości, dziedziczenie klasy jest zabronione. –

19

Trzeba użyć składni :_* co oznacza „leczyć tej sekwencji jako sekwencję”! W przeciwnym razie twoja sekwencja n pozycji będzie traktowana jako ciąg 1 elementu (który będzie twoją sekwencją n pozycji).

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) 
Powiązane problemy