有人可能会更多关注以下scala代码,这对我来说并不完全清楚吗?我有以下功能定义
def ids(ids: String*) = {
_builder.ids(ids: _*)
this
}
然后我尝试将变量参数列表传递给此函数,如下所示:
def searchIds(kind: KindOfThing, adIds:String*) = {
...
ids(adIds)
}
首先,ids(adIds)
段不起作用,这有点奇怪,因为错误消息说:类型不匹配,预期:字符串,实际:Seq [String]。这意味着变量参数列表不会被输入为集合或序列。
为了解决这个问题,请使用技巧ids(adIds: _*)
。
我不是100%肯定如何:_ *有效,有人可以放一些棚子吗? 如果我没记错的话:意味着操作应用于右参数而不是左,_表示“应用”传递元素,... 我检查了字符串和序列scaladoc,但无法找到:_ *方法。
有人可以解释一下吗?
THX
答案 0 :(得分:7)
您应该查看您的方法定义:
def ids(ids: String*)
这里你说这个方法需要可变数量的字符串,例如:
def ids(id1: String, id2: String, id3: String, ...)
然后是第二种方法:
def searchIds(kind: KindOfThing, adIds:String*)
这也需要一个可变数量的字符串,这些字符串打包成Seq[String]
,因此adIds
实际上是Seq
,但您的第一个方法ids
不会取一个Seq
,需要N
个字符串,这就是ids(adIds: _*)
有效的原因。
: _*
这称为splat operator,正在做的是将Seq
展开到N
字符串。