如何将 Scala 数组传递给 Scala vararg 方法?
How to pass Scala array into Scala vararg method?
考虑以下代码:
private def test(some:String*){
}
private def call () {
val some = Array("asd", "zxc")
test(some)
}
它打印 expect String, found Array[String]
为什么? Scala 可变参数不是数组吗?
备注
我在 Stack Overflow 上发现了几个关于 Scala 可变参数的问题,但它们都是关于调用 Java 可变参数方法或关于将 Scala 列表转换为数组的。
像这样将:_*
附加到test
中的参数
test(some:_*)
它应该会如您所愿地工作。
如果您想知道神奇的 :_*
有什么作用,请参阅 this question。
很简单:
def test(some:String*){}
def call () {
val some = Array("asd", "zxc")
test(some: _*)
}
启动 Scala 2.13.0,如果您使用 some: _*
,您将收到此 警告:
Passing an explicit array value to a Scala varargs
method is
deprecated (since 2.13.0
) and will result in a defensive copy; Use
the more efficient non-copying ArraySeq.unsafeWrapArray
or an explicit
toIndexedSeq
call
按照建议,使用 scala.collection.immutable.ArraySeq.unsafeWrapArray
:
unsafeWrapArray(some):_*
此外,您应该收到的另一个警告是这个
procedure syntax is deprecated: instead, add : Unit =
to explicitly
declare test
's return type
要解决这个问题,请在函数的左括号之前添加 =
:
def test(some:String*) = {
考虑以下代码:
private def test(some:String*){
}
private def call () {
val some = Array("asd", "zxc")
test(some)
}
它打印 expect String, found Array[String]
为什么? Scala 可变参数不是数组吗?
备注
我在 Stack Overflow 上发现了几个关于 Scala 可变参数的问题,但它们都是关于调用 Java 可变参数方法或关于将 Scala 列表转换为数组的。
像这样将:_*
附加到test
中的参数
test(some:_*)
它应该会如您所愿地工作。
如果您想知道神奇的 :_*
有什么作用,请参阅 this question。
很简单:
def test(some:String*){}
def call () {
val some = Array("asd", "zxc")
test(some: _*)
}
启动 Scala 2.13.0,如果您使用 some: _*
,您将收到此 警告:
Passing an explicit array value to a Scala
varargs
method is deprecated (since2.13.0
) and will result in a defensive copy; Use the more efficient non-copyingArraySeq.unsafeWrapArray
or an explicittoIndexedSeq
call
按照建议,使用 scala.collection.immutable.ArraySeq.unsafeWrapArray
:
unsafeWrapArray(some):_*
此外,您应该收到的另一个警告是这个
procedure syntax is deprecated: instead, add
: Unit =
to explicitly declaretest
's return type
要解决这个问题,请在函数的左括号之前添加 =
:
def test(some:String*) = {