为了账号安全,请及时绑定邮箱和手机立即绑定

‘:*’(冒号下划线星号)在Scala中做什么?

‘:*’(冒号下划线星号)在Scala中做什么?

‘:*’(冒号下划线星号)在Scala中做什么?我有以下代码这个问题:def addChild(n: Node, newChild: Node) = n match {   case Elem(prefix, label, attribs, scope, child @ _*) => Elem(prefix, label, attribs, scope, child ++ newChild : _*)   case _ => error("Can only add children to elements!")}里面的一切都很清楚,除了这段:child ++ newChild : _*是干什么的呢?我知道有Seq[Node]连在一起Node然后呢?什么: _*做?
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

它“碎裂”1序列。

查看构造函数签名

new Elem(prefix: String, label: String, attributes: MetaData, scope: NamespaceBinding,
         child: Node*)

被称为

new Elem(prefix, label, attributes, scope,
         child1, child2, ... childN)

但这里只有一个序列child1child2等等,这样就允许将结果序列用作构造函数的输入。

编码愉快。


1这没有一个可爱的名字在补充,但以下是细节。重要的是,它改变了Scala用重复的参数将参数绑定到方法的方式(如Node*(见上文)。

这个_*类型注释包括在补充劳工计划的“4.6.2重复参数”中。

参数部分的最后一个值参数可以是由“*”(例如(.,x:t*)连接的fi)。方法中这种重复参数的类型是序列类型Scala.Seq[T]。方法具有重复参数T*的变量数为T型。也就是说,如果方法m具有类型(p1:t1),则为。....,pn:TN,PS:S*)U被应用于参数(E1,。....,ek)其中k>=n,则该应用程序中的m具有类型(p1:t1,。....,pn:TN,PS:S.....,ps0S)U,类型S的k‘n出现,其中超过ps的任何参数名称都是新的。这个规则的唯一例外是,如果最后一个参数通过_*类型注释被标记为序列参数。如果上面的m被应用于参数(E1,。....,en,e0:*),则该应用程序中的m类型为(p1:t1,。....,pn:TN,PS:scala.Seq[S])


查看完整回答
反对 回复 2019-06-29
?
UYOU

TA贡献1878条经验 获得超4个赞

  • child ++ newChild

    -序列
  • :

    -类型归属,帮助编译器理解的提示,该表达式具有什么类型?
  • _*

    -接受任何值+vararg运算符的占位符

child ++ newChild : _*膨胀Seq[Node]Node*(告诉编译器我们使用的是varargs,而不是序列)。对于只能接受varargs的方法特别有用。


查看完整回答
反对 回复 2019-06-29
?
精慕HU

TA贡献1845条经验 获得超8个赞

以上所有的答案看起来都很棒,但只是需要一个样本来解释这一点。下面是:

val x : Seq[Seq[Int]] = Seq(Seq(1),Seq(2))def f(arg: Seq[Any]*) : Int = {
 arg.length}f(x) //1 as x is taken as single argf(x:_*)  // 2 as x is "unpacked" as a Seq[Any]*

所以现在我们知道了:_*这是为了告诉编译器:请解压缩这个参数,并将这些元素绑定到函数调用中的vararg参数,而不是将x作为一个参数。

所以简单地说,:_*是在将参数传递给vararg参数时消除歧义。


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 742 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信