Da ich neu in Scala (2.9.1) bin, habe ich ein List[Event]
und möchte es in ein kopieren Queue[Event]
, aber die folgende Syntax ergibt Queue[List[Event]]
stattdessen ein:
val eventQueue = Queue(events)
Aus irgendeinem Grund funktioniert Folgendes:
val eventQueue = Queue(events : _*)
Aber ich würde gerne verstehen, was es tut und warum es funktioniert? Ich habe mir bereits die Signatur der Queue.apply
Funktion angesehen:
def apply[A](elems: A*)
Und ich verstehe, warum der erste Versuch nicht funktioniert, aber was bedeutet der zweite? Was ist :
und _*
in diesem Fall und warum nimmt die apply
Funktion nicht einfach eine Iterable[A]
?
quelle
def sum(xs: _*)
wirft 'Fehler: ungebundener Platzhaltertyp'xs: int
bedeutet in scala, dass der Typ von xs int ist. Dies ist die obige Syntax in scala, bei derxs: _*
xs in seine einzelnen Mitglieder umgewandelt wird.def sum(args: Int*)
und Sie rufen sie mit dem Platzhalter "generischen" var-args-Typ auf :val a = sum(xs: _*)
. Denken Sie an_*
"Ich übergebe ein Int * oder einen String * oder irgendetwas *, das in der Methodensignatur definiert ist"Für Python-Leute:
Der
_*
Operator von Scala entspricht mehr oder weniger dem * -Operator von Python .Beispiel
Die Umwandlung des scala Beispiel aus dem Link bereitgestellt durch Luigi Plinge :
zu Python würde aussehen wie:
und beide geben die folgende Ausgabe:
Der Unterschied: Positionsparameter auspacken
Der Python-
*
Operator kann sich auch mit dem Auspacken von Positionsparametern / Parametern für Funktionen mit fester Arität befassen:Dasselbe mit Scala machen:
wird versagen:
Aber mit scala ist es möglich, dasselbe zu erreichen:
Laut Lorrin Nelson funktioniert das so:
Weitere Lesung:
quelle