2009-09-17 104 views
28

Java有:Scala如何在方法定義中接收多個參數?

public void someMethod(int ... intArray) { // question: what is the equivalent to "..." 
    // do something with intArray 
} 

我怎麼能實現在Scala中相同的功能?也就是說,將一個未定義數量的參數傳遞給一個方法?

+4

這就是所謂的 「可變參數」(爲:可變參數)。嘗試搜索「scala varargs」。 – Jesper 2009-09-17 14:22:02

+1

只是爲了google的緣故,...是一個elipsis – daveb 2009-09-17 20:34:00

+0

我需要帶有'by-name'變量的可變參數。看來,目前不能完成:http:// stackoverflow。com/questions/2707186/by-name-repeated-parameters – akauppi 2013-03-31 10:34:31

回答

38
def someMethod(values : Int*) 

給出一個數組。將可變參數參數作爲最後一個形式參數。

+0

感謝,作品像一個魅力! – dankilman 2009-09-17 13:16:43

+0

不是scala中的數組。 – 2017-08-31 01:11:17

48

Java和Scala都有可變參數,兩者都只支持最後一個參數。

def varargTest(ints:Int*) { ints.foreach(println) } 

this article,不同的是在用於可變參數參數的類型:

  • 陣列爲Java
  • SEQ(序列),用於Scala的:它可以重複許多方法,如收藏品foreach,地圖,過濾器,查找...可用

'*'代表0個或多個參數。

注:如果參數值已經 「打包」 爲一個序列,比如列表,它失敗:

# varargTest(List(1,2,3,4,5)) 
# //--> error: type mismatch; 
# //--> found : List[Int] 
# //--> required: Int 
# //-->  varargTest(List(1,2,3,4,5)) 
# //--> 

但這會通過:

varargTest(List(1,2,3):_*) 
    //--> 1 
    //--> 2 
    //--> 3 

'_' 是類型推斷的佔位符快捷方式。 '_*'在這裏適用於'重複類型。
Scala Specification第4.6.2節中提到:

的參數部分的最後值參數可以由「*」,例如爲後綴 (..., x:T *)
該方法內部的這種重複參數的類型是 序列類型scala.Seq[T]
重複參數T*的方法採用可變數量的參數類型T

(T1, . . . , Tn,S*)U => (T1, . . . , Tn,S, . . . , S)U, 

唯一的例外是,如果最後一個參數被標記爲通過_*類型註釋的序列參數。

(e1, . . . , en,e0: _*) => (T1, . . . , Tn, scala.Seq[S]). 

注之二:提防的Java的基本類型擦除:

//--> error: double definition: 
//--> method varargTest:(ints: Seq[Int])Unit and 
//--> method varargTest:(ints: Int*)Unit at line 10 
//--> have same type after erasure: (ints: Sequence)Unit 
//--> def varargTest(ints:Seq[Int]) { varargTest(ints: _*) } 
+0

你能指出我對':_ *'是什麼意思的解釋嗎? – IttayD 2009-10-14 07:35:56

相關問題