使用模式匹配来交换scala中的两个元素

时间:2017-06-15 13:00:15

标签: scala

我想使用模式匹配来交换数组的前两个元素,我的代码如下所示:

>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)。如何修改它?

1 个答案:

答案 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>