【问题标题】:How to pass Scala array into Scala vararg method?如何将 Scala 数组传递给 Scala vararg 方法?
【发布时间】:2015-09-12 21:50:48
【问题描述】:

考虑下面的代码:

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 列表转换为数组的问题。

【问题讨论】:

    标签: arrays scala variadic-functions


    【解决方案1】:

    启动 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*) = {
    

    【讨论】:

      【解决方案2】:

      很简单:

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

      【讨论】:

        【解决方案3】:

        像这样将:_*附加到test中的参数

        test(some:_*)
        

        它应该可以按您的预期工作。

        如果您想知道神奇的:_* 有什么作用,请参考this question

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多