2010-11-14 72 views
40

我只注意到這個結構上的某個地方網站:語法糖:_ *用於治療SEQ方法參數

val list = List(someCollection: _*) 

是什麼_*意思?這是一個方法調用的語法糖嗎?我的自定義類應該滿足什麼約束,以便它可以利用此語法糖?

回答

15

這是用於分解數組的scala語法。某些函數需要可變數量的參數,並且要傳入數組,需要將: _*附加到數組參數。

+7

雞蛋裏挑骨頭:參數只需爲一個'Seq',或隱式轉換爲一個'Seq'。 – retronym 2010-11-14 15:12:15

59

通常,:表示法用於類型歸屬,強制編譯器將某個值視爲某種特定的類型。這不是相當於與鑄造相同。

val b = 1 : Byte 
val f = 1 : Float 
val d = 1 : Double 

在這種情況下,你歸咎於特殊可變參數類型。這反映了用於聲明可變參數一個參數的星號標記,並且可以在任何類型的子類Seq[T]的變量中:我的心靈,我預測你會看到一個通配符很多

def f(args: String*) = ... //varargs parameter, use as an Array[String] 
val list = List("a", "b", "c") 
f(list : _*) 
+1

我試着返回一個類似'String *'的字符串數組,我得到一個無法解析的錯誤*。如果我返回'Array [String]'並將它傳遞給帶有args(args:String *)的方法'它表示期望String而不是'Array [String]' – 2017-07-05 08:40:50