param:_ *在Scala中的含义是什么?

作为Scala(2.9.1)的新手,我有一个List[Event]并希望将其复制到Queue[Event] ,但是下面的Syntax生成一个Queue[List[Event]]

 val eventQueue = Queue(events) 

出于某种原因,以下工作:

 val eventQueue = Queue(events : _*) 

但是我想知道它是干什么的,为什么它有效? 我已经看了Queue.apply函数的签名:

 def apply[A](elems: A*) 

我明白为什么第一次尝试不起作用,但第二次的意义是什么? 在这种情况下,什么是:_* ,为什么apply函数只是取一个可Iterable[A]

a: A是types归属; 看Scalatypes归属的目的是什么?

: _*是一个types归属的特殊实例,它告诉编译器将一个序列types的单个参数当作可变参数序列,即可变参数。

使用Queue.apply创build一个Queue是完全有效的,该Queue有一个单一的元素,这个元素是一个序列或者可迭代的,所以当你给出一个单一的Iterable[A]时候就是这样的情况。

这是一个特殊的符号,它告诉编译器将每个元素作为自己的parameter passing,而不是把它作为单个参数。 看到这里 。

它是一个types注释,它指示了一个序列参数 ,并被作为语言规范“重复参数”的4.6.2节中的通用规则的“例外”。

当一个函数需要可变数量的参数时,如函数def sum(args: Int*) ,它可以被调用为sum(1)sum(1,2)等。如果你有一个列表比如xs = List(1,2,3) ,你不能传递xs本身,因为它是一个List而不是Int ,但是你可以使用sum(xs: _*)来传递它的元素。