我想使用模式匹配来交换数组的前两个元素,我的代码如下所示:
>scala val arr = Array(1,2,3,4,5)
>arr match { case Array(a,b,rest @ _*) => Array(b,a,rest)
// Array(2,1,Vector(3,4,5))
但是,结果应为Array(2,1,3,4,5)
。如何修改它?
答案 0 :(得分:2)
您的问题并未传递rest
作为varargs,这是使用rest: _*
语法完成的。这告诉编译器将集合方法作为varargs传递,它与Seq
一起使用。
val arr = Array(1, 2, 3, 4, 5)
arr match { case Array(a, b, rest @ _*) => Array(b, a +: rest: _*) }
有一个Array.apply
方法,而不是第一个元素后跟一个varargs,但没有一个传递两个元素然后传递varargs。因此,我们需要在将整个事物作为varargs传递之前将第二个元素添加到Seq
。
这就是为什么我们最终得到a +: rest: _*
。在表达式的右侧调用+:
,因此方法+:
在Seq
上定义,按惯例,以:
结尾的Scala方法是右关联的。 / p>