Tengo el siguiente código de esta pregunta :
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!")
}
Todo en él está bastante claro, excepto esta pieza: child ++ newChild : _*
¿Qué hace?
Entiendo que hay Seq[Node]
concatenado con otro Node
, y luego? ¿Qué : _*
hacer?
scala
pattern-matching
amorfis
fuente
fuente
Respuestas:
Se "salpica" 1 la secuencia.
Mira la firma del constructor
que se llama como
pero aquí solo hay una secuencia, no
child1
,child2
etc., por lo que esto permite que la secuencia de resultados se use como entrada para el constructor.Feliz codificación
1 Esto no tiene un nombre cursi en el SLS, pero aquí están los detalles. Lo importante es que cambia la forma en que Scala vincula los argumentos al método con parámetros repetidos (como se indica
Node*
anteriormente).La
_*
anotación de tipo se trata en "4.6.2 Parámetros repetidos" del SLS.fuente
child ++ newChild
- secuencia:
- type ascription, una pista que ayuda al compilador a comprender, qué tipo tiene esa expresión_*
- marcador de posición que acepta cualquier valor + operador varargchild ++ newChild : _*
se expandeSeq[Node]
aNode*
(le dice al compilador que estamos trabajando más bien con un varargs que con una secuencia). Particularmente útil para los métodos que pueden aceptar solo varargs.fuente
Toda la respuesta anterior se ve genial, pero solo necesita una muestra para explicar esto. Aquí está :
Entonces, ahora sabemos qué
:_*
hacer para decirle al compilador: desempaquete este argumento y vincule esos elementos al parámetro vararg en la llamada a la función en lugar de tomar la x como un argumento único.En pocas palabras,
:_*
es eliminar la ambigüedad cuando se pasa el argumento al parámetro vararg.fuente
Para algunas personas perezosas como yo, ¡simplemente convierte un Seq en varArgs!
fuente