def swapElementsOfArray(array: Array[Int]) =
array match {
case Array(x, y, z @ _*) => Array(y, x) ++ z
case _ => array
}
我不知道如何在这里使用@ _ *。任何人都可以帮忙解释一下吗?提前谢谢你。
答案 0 :(得分:2)
运算符_*
引用一系列元素,在您的情况下,它是" tail"数组。
运算符@
允许您将匹配的模式绑定到变量,在您的情况下" z"
因此,对于z @ _*
,您将Z分配给您未使用的其余数组,但稍后需要引用它。
val a= Array(2, 1, 3, 5, 3, 2)
def swapElementsOfArray(array: Array[Int]) =
array match {
case Array(x, y, z @ _*) => Array(y, x) ++ z
case _ => array
}
swapElementsOfArray(a).toString
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 5, 3, 2
z将是" 3,5,3,2"你不需要它,但你需要参考。
答案 1 :(得分:1)
在这个具体示例中,_*
表示"阵列的其余部分"。
z @
部分是标准模式匹配语法,用于将变量名称绑定到模式
请注意,_*
运算符是适用于任何vararg参数的通用运算符,有时也称为" splat运算符"。
这是相关的句子:
此规则的唯一例外是,如果通过
_*
类型注释将最后一个参数标记为序列参数。如果上面的m
适用于参数(e1,…,en,e′: _*)
,那么该应用中的m
类型将被视为(p1:T1,…,pn:Tn,ps:scala.Seq[S])
这适用于匹配和传递varargs。例如,splat运算符可用于传递期望vararg的序列。
示例:
val s = Seq(1, 2, 3)
val a1 = Array(s) // does not compile
val a2 = Array(s: _*) // compiles, s is passed as vararg
a2 match {
case Array(s @ _*) => s // s now contains all the elements of a2
}
a2 match {
case Array(head, tail @ _*) => head // tail contains all the elements except the first
case _ => ??? // empty list!
}