如何将Scala数组传递给Scala vararg方法?

时间:2015-06-26 04:10:32

标签: arrays scala variadic-functions

请考虑以下代码:

private def test(some:String*){

}

private def call () {
  val some = Array("asd", "zxc")
  test(some)
}

打印expect String, found Array[String]为什么? Scala varargs不是数组吗?

注意

我在Stack Overflow上发现了几个关于Scala varargs的问题,但所有这些问题都是关于调用Java varargs方法或将Scala列表转换为数组。

3 个答案:

答案 0 :(得分:91)

:_*附加到test中的参数

test(some:_*)

它应该像你期望的那样工作。

如果你想知道那个神奇的:_*是做什么的,请参考this question

答案 1 :(得分:35)

很简单:

def test(some:String*){}

def call () {
  val some = Array("asd", "zxc")
  test(some: _*)
}

答案 2 :(得分:0)

从 Scala 2.13.0 开始,如果您使用 some: _*,您将收到此警告

<块引用>

将显式数组值传递给 Scala varargs 方法是 已弃用(自 2.13.0 起)并将导致防御性副本;采用 更有效的非复制 ArraySeq.unsafeWrapArray 或显式 toIndexedSeq 调用

按照建议,使用 scala.collection.immutable.ArraySeq.unsafeWrapArray

unsafeWrapArray(some):_*

另外,你应该得到的另一个警告是这个

<块引用>

不推荐使用过程语法:相反,将 : Unit = 添加到显式 声明 test 的返回类型

要解决这个问题,请在函数的左括号前添加 =

def test(some:String*) = {