scala 变量参数 :_*

scala variable arguments :_*

有人可以在我不完全清楚的以下一段 Scala 代码中引入更多的 shed 吗?我定义了以下函数

  def ids(ids: String*) = {
    _builder.ids(ids: _*)
    this
  }

然后我尝试将可变参数列表传递给此函数,如下所示:

def searchIds(kind: KindOfThing, adIds:String*) = {
...
ids(adIds)
}

首先,ids(adIds) 部分不起作用,起初有点奇怪,因为错误消息说:类型不匹配,预期:String,实际:Seq[String]。这意味着变量参数列表不会被类型化为集合或序列。

为了解决这个问题,请使用技巧 ids(adIds: _*)

我不是 100% 确定 :_* 是如何工作的,有人可以在上面放一些棚子吗? 如果我没记错的话 : 表示操作应用于右参数而不是左参数,_ 表示 "apply" 传递给元素,... 我检查了 String 和 Sequence scaladoc 但找不到 :_* 方法。

有人可以解释一下吗?

感谢

你应该看看你的方法定义:

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 字符串。