2011-05-18 51 views
146

我有这样一段代码从this question在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连接,然后呢? : _*做什么?

+42

非常感谢您为标题添加(冒号下划线明星)! – Gal 2014-09-02 18:29:16

回答

110

它“splats”该序列。

看看构造函数签名的

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

将其称作

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

但这里只有一个序列,不child1child2等,所以这使得结果序列是用作构造函数的输入。

快乐编码。


这并不在SLS有一个娇媚名,但这里有细节。重要的是,它改变了Scala如何通过重复参数将参数绑定到方法上(如上面的Node*所示)。

_*类型注释在SLS的“4.6.2重复参数”中有介绍。

参数段的最后一个值参数可以用“*”来表示,例如“*”。 (...,x:T *)。该方法内重复参数的类型为 ,序列类型为scala.Seq [T]。具有重复参数T *的方法采用 类型T的可变数量的参数。也就是说,如果将类型为 (p1:T1,...,pn:Tn,ps:S *)U的方法m应用于其中k> = n的自变量(e1,...,ek),则 m在该应用中被用于具有类型S的k个发生的类型(p1:T1,...,pn:Tn,ps:S,...,ps0S)U, ,其中任何超过ps的参数名称是 新鲜。 这条规则的唯一例外是如果最后一个参数被标记为 通过_ *类型注释的序列参数。如果将上面的m应用于参数(e1,...,en,e0:_ *),那么该应用程序中m的类型取为 (p1:T1,...,pn:Tn,ps:斯卡拉。SEQ [S])

+3

我们喜欢称它为“Smooch运算符”,尽管它实际上并不是运算符:) – 2016-04-28 16:15:29

+0

在Python中,这称为解包 – joshlk 2016-05-05 13:48:42

+0

序列可以存在多长时间,例如Java可变参数是否存在限制? – qwwqwwq 2017-05-03 04:52:04

72
  • child ++ newChild - 序列
  • : - 类型归属,一个提示有助于编译理解,什么类型的这是否表达具有
  • _* - 占位符接受任何值+ vararg运营商

child ++ newChild : _*扩大Seq[Node]Node*(告诉编译器,我们宁愿使用可变参数,而不是序列)。对于只能接受可变参数的方法特别有用。

+0

你可以写更多关于“类型归属”?它是什么,它是如何工作的? – amorfis 2011-05-19 07:47:42

+8

http://stackoverflow.com/questions/2087250/what-is-the-purpose-of-type-ascription-in-scala – 2011-05-19 09:52:29

1

以上所有答案看起来不错,但只需要一个示例来解释这一点。 这就是:

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 arg 
f(x:_*) // 2 as x is "unpacked" as a Seq[Any]* 

所以,现在我们知道什么:_*做的是告诉编译器:请解开这个说法,并绑定在函数调用这些元素的可变参数的参数,而不是把X作为一个参数。

所以简而言之,:_*是为vararg参数传递参数时消除不明确性。

相关问题