2017-06-15 32 views
0

兩個元件我想使用模式匹配來交換陣列的前兩個元素,我作爲代碼如下所示:使用模式匹配來交換在階

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

回答

2

您的問題未通過rest作爲可變參數,這是使用rest: _*語法完成的。這告訴編譯器將收集方法作爲可變參數傳入,它與Seq一起使用。

val arr = Array(1, 2, 3, 4, 5) 
arr match { case Array(a, b, rest @ _*) => Array(b, a +: rest: _*) } 

有一個Array.apply方法比需要一個第一元件之後是可變參數,但有沒有在兩個元件來傳遞,然後可變參數。因此,我們需要在將所有東西作爲可變參數傳遞之前將第二個元素預先加入Seq

這就是爲什麼我們最終與a +: rest: _*+:在表達式的右側被調用,所以方法+:被定義在Seq上,按照慣例,以:結尾的Scala方法是正確關聯的。

+0

感謝您的回答! 「休息」是否等於「Seq(3,4,5)」? – xyz

+1

此外,我出了一個workaroud'arr match {case Array(a,b,rest @ _ *)=> Array(b,a)++ rest' – xyz