任何人都可以在这段代码中解释@ _ *的含义吗?

时间:2018-06-04 10:52:29

标签: scala

def swapElementsOfArray(array: Array[Int]) = 
    array match {
        case Array(x, y, z @ _*) => Array(y, x) ++ z
        case _ => array
}

我不知道如何在这里使用@ _ *。任何人都可以帮忙解释一下吗?提前谢谢你。

2 个答案:

答案 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运算符"。

您可以在规范中阅读:https://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html#repeated-parameters

这是相关的句子:

  

此规则的唯一例外是,如果通过_*类型注释将最后一个参数标记为序列参数。如果上面的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!
}