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: _*)
来传递它的元素。