Saya memiliki bagian kode berikut dari pertanyaan ini :
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!")
}
Semua yang ada di dalamnya cukup jelas, kecuali bagian ini: child ++ newChild : _*
Apa fungsinya?
Saya mengerti ada Seq[Node]
disatukan dengan yang lain Node
, dan kemudian? Apa yang : _*
harus dilakukan
scala
pattern-matching
amorfis
sumber
sumber
Jawaban:
Itu "percikan" 1 urutannya.
Lihatlah tanda tangan konstruktor
yang disebut sebagai
tetapi di sini hanya ada urutan, bukan
child1
,,child2
dll. jadi ini memungkinkan urutan hasil yang akan digunakan sebagai input ke konstruktor.Selamat coding.
1 Ini tidak memiliki nama imut dalam SLS, tetapi di sini adalah rinciannya. Yang penting untuk didapatkan adalah bahwa ia mengubah cara Scala mengikat argumen ke metode dengan parameter berulang (seperti dilambangkan dengan di
Node*
atas).The
_*
penjelasan jenis tercakup dalam "4.6.2 Parameter berulang" dari SLS.sumber
child ++ newChild
- urutan:
- type ascription, sebuah petunjuk yang membantu kompiler memahami, tipe apa yang dimiliki oleh ekspresi itu_*
- placeholder menerima nilai + operator varargchild ++ newChild : _*
expandSeq[Node]
toNode*
(memberi tahu kompiler bahwa kita agak bekerja dengan varargs, daripada berurutan). Sangat berguna untuk metode yang hanya dapat menerima varargs.sumber
Semua jawaban di atas tampak hebat, tetapi hanya perlu sampel untuk menjelaskan ini. Ini dia :
Jadi sekarang kita tahu apa yang
:_*
harus dilakukan untuk memberitahu compiler: tolong buka paket argumen ini dan ikat elemen-elemen tersebut ke parameter vararg dalam pemanggilan fungsi daripada mengambil x sebagai argumen tunggal.Jadi singkatnya,
:_*
adalah untuk menghapus ambiguitas ketika meneruskan argumen ke parameter vararg.sumber
Untuk beberapa orang malas seperti saya, itu hanya mengubah Seq menjadi varArgs!
sumber