Ich habe den folgenden Code aus dieser Frage :
def addChild(n: Node, newChild: Node) = n match {
case Elem(prefix, label, attribs, scope, child @ _*) => Elem(prefix, label, attribs, scope, child ++ newChild : _*)
case _ => error("Can only add children to elements!")
}
Alles darin ist ziemlich klar, außer diesem Stück: child ++ newChild : _*
Was tut es?
Ich verstehe, dass es Seq[Node]
mit einem anderen verkettet ist Node
, und dann? Was macht : _*
das
scala
pattern-matching
Amorfis
quelle
quelle
Antworten:
Es "splats" 1 die Sequenz.
Schauen Sie sich die Konstruktorsignatur an
das heißt als
aber hier gibt es nur eine Folge, nicht
child1
,child2
usw. so dies die Ergebnisfolge ermöglicht als die Eingabe an den Konstruktor verwendet werden.Viel Spaß beim Codieren.
1 Dies hat keinen Cutesy-Namen im SLS, aber hier sind die Details. Das Wichtigste ist, dass es ändert, wie Scala die Argumente mit wiederholten Parametern (wie
Node*
oben angegeben) an die Methode bindet .Die
_*
Typanmerkung wird in „4.6.2 Wiederholte Parametern“ des SLS bedeckt.quelle
child ++ newChild
- Reihenfolge:
- Typzuweisung, ein Hinweis, der dem Compiler hilft zu verstehen, welchen Typ dieser Ausdruck hat_*
- Platzhalter, der einen beliebigen Wert + vararg-Operator akzeptiertchild ++ newChild : _*
erweitertSeq[Node]
aufNode*
(teilt dem Compiler mit, dass wir eher mit einem varargs als mit einer Sequenz arbeiten). Besonders nützlich für Methoden, die nur Varargs akzeptieren können.quelle
Die obige Antwort sieht gut aus, benötigt aber nur ein Beispiel, um dies zu erklären. Hier ist es :
Jetzt wissen wir also, was
:_*
Sie dem Compiler mitteilen müssen: Bitte entpacken Sie dieses Argument und binden Sie diese Elemente im Funktionsaufruf an den Parameter vararg, anstatt das x als einzelnes Argument zu verwenden.:_*
Kurz gesagt, das heißt, Mehrdeutigkeiten zu beseitigen, wenn Argumente an vararg-Parameter übergeben werden.quelle
Für einige der faulen Leute wie mich konvertiert es einfach eine Seq in varArgs!
quelle