2011-10-29 53 views
39

作爲新斯卡拉(2.9.1),我有一個List[Event],並希望將其複製到Queue[Event],但下面的語法產生一個Queue[List[Event]]代替:param:_ *在Scala中的含義是什麼?

val eventQueue = Queue(events) 

出於某種原因,以下工作:

val eventQueue = Queue(events : _*) 

但我想了解它的功能,以及它爲什麼起作用?我已經看了看Queue.apply功能的簽名:

def apply[A](elems: A*) 

我明白爲什麼第一次嘗試不起作用,但什麼是第二個意思?什麼是:_*在這種情況下,爲什麼apply函數只是採取Iterable[A]

回答

40

a: A是類型歸屬;請參閱What is the purpose of type ascriptions in Scala?

: _*是一種類型歸屬的特殊實例,它告訴編譯器將一個序列類型的單個參數當作可變參數序列,即可變參數。

這是完全有效的創建使用Queue.apply有一個元素是一個序列或迭代一個Queue,所以這是當你給一個Iterable[A]究竟發生了什麼。

+1

感謝您指示我鍵入歸屬! – Chris

34

這是一個特殊的符號,它告訴編譯器將每個元素作爲自己的參數傳遞,而不是將其作爲單個參數。見here

這是一個類型註釋,它指示序列參數,並且在語言規範「重複參數」的第4.6.2節中的一般規則中被提及爲「異常」。

當函數帶有可變數量的參數時,一個函數,如def sum(args: Int*),可以調用sum(1),sum(1,2)等。如果你有一個列表如xs = List(1,2,3),你不能通過xs本身,因爲它是List而不是Int,但你可以使用它的元素傳遞sum(xs: _*)

+3

也是一個偉大的回答,感謝和給予好評 – Chris

+0

'高清總和(XS:_ *)'拋出 '錯誤:未綁定的通配符類型' – 7kemZmani

+0

你的答案是明確的,但這實際上給我造成了更多的困惑,通常在scala中,'xs:int'表示xs的類型是int,這就是上面scala中的一個語法,其中'xs:_ *'表示xs被轉換爲其各個成員。 – Rpant

0

對於Python鄉親:

Scala的_*運營商是Python *-operator或多或少等同。


轉換從linkLuigi Plinge提供階例如:

def echo(args: String*) = 
    for (arg <- args) println(arg) 

val arr = Array("What's", "up", "doc?") 
echo(arr: _*) 

到Python將如下所示:

def echo(*args): 
    for arg in args: 
     print "%s" % arg 

arr = ["What's", "up", "doc?"] 
echo(*arr) 

並且兩個給跟隨着克輸出:

What's
up
doc?


的差異:拆封位置參數

雖然Python的* - 運算符也可以處理用於在固定元數函數位置參數/參數的解壓縮:

def multiply (x, y): 
    return x * y 

operands = (2, 4) 
multiply(*operands) 

8

D卷板機同樣使用Scala:

def multiply(x:Int, y:Int) = { 
    x * y; 
} 

val operands = (2, 4) 
multiply (operands : _*) 

將失敗:

not enough arguments for method multiply: (x: Int, y: Int)Int.
Unspecified value parameter y.

但它有可能達到同樣的使用Scala:

def multiply(x:Int, y:Int) = { 
    x*y; 
} 

val operands = (2, 4) 
multiply _ tupled operands 

根據Lorrin Nelson這是它如何工作的:

The first part, f _, is the syntax for a partially applied function in which none of the arguments have been specified. This works as a mechanism to get a hold of the function object. tupled returns a new function which of arity-1 that takes a single arity-n tuple.

Futher閱讀:

相關問題