Scala 变量函数中的下划线星号?
我现在正在跟踪 这是Scala 变量函数中的下划线星号?,scala,Scala,我现在正在跟踪 这是List[A] def apply[A](as: A*): List[A] = if (as.isEmpty) Nil else ::(as.head, apply(as.tail: _*)) 如果我在as.tail:\u*中省略了:\u*,scala会抱怨类型不匹配,这是有道理的,因为as.tail在这里是Seq[A] 但是\u*在这里到底做了什么 编辑:: 正确的术语是序列通配符,:\u*表示法只是告诉scala编译器将传递到方法中的集合元素(在参数中继续进行
List[A]
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else ::(as.head, apply(as.tail: _*))
如果我在as.tail:\u*
中省略了:\u*
,scala会抱怨类型不匹配,这是有道理的,因为as.tail
在这里是Seq[A]
但是\u*
在这里到底做了什么
编辑::
正确的术语是序列通配符,
:\u*
表示法只是告诉scala编译器将传递到方法中的集合元素(在参数中继续进行的集合):\u*)视为一个接一个地传递到varargs方法中。例如,如果你有
def foo(x: Int*) = x.sum
val xs = Seq(1, 2, 3, 4)
然后
就像你打字一样
foo(1, 2, 3, 4)
有趣。因此,我认为
.*
是一个特殊的构造,而不是另一个我无法理解的复杂下划线规则,对吗?我还没有遇到另一个例子,其中下划线用于注释类型(除了存在类型)。感谢“序列参数”对应于“模式序列”中的“序列通配符”,这是Scala中的另一个隐藏特性。非常感谢。
foo(1, 2, 3, 4)