Scala在Variadic函数中用下划线标出星号?

时间:2015-10-02 04:09:26

标签: scala

我目前正在关注Functional Programming In Scala

这是apply

List[A]的伪实现
def apply[A](as: A*): List[A] = 
  if (as.isEmpty) Nil
  else ::(as.head, apply(as.tail: _*))

如果我在: _*中省略as.tail: _*,则scala会抱怨类型不匹配,这是有道理的,因为此处as.tailSeq[A]

_*到底做了什么?

编辑::

正确的术语是序列通配符

1 个答案:

答案 0 :(得分:7)

: _*表示法只是告诉scala编译器处理传递给方法的集合的元素(在参数中继续: _*的集合),就像它们已经通过一个传递一样一进入varargs方法。例如,如果你有

def foo(x: Int*) = x.sum
val xs = Seq(1, 2, 3, 4)

然后

foo(xs: _*)

就像你输入了

一样
foo(1, 2, 3, 4)