如何在 Scala 中转发重复的参数? [英] How do I forward repeated arguments in Scala?

查看:43
本文介绍了如何在 Scala 中转发重复的参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 Scala (2.7) 中,如果我有这个功能:

In Scala (2.7), if I have this function:

def foo(args: Array[String]) =
  for (arg <- args) println(arg)

如果我现在尝试定义以下内容:

If I now try to define the following:

def bar(args: String*) = foo(args)

然后编译器抱怨:

<console>:5: error: type mismatch;
 found   : String*
 required: Array[String]
       def bar(args: String*) = foo(args)
                                ^

我不明白这个错误,因为编程 Scala 书指出函数 bar 内的 args 的类型实际上是 Array[String].我应该如何编写这样一个带有重复参数的包装函数?

I don't understand this error, since the Programming Scala book states that the type of args inside function bar is actually Array[String]. How am I supposed to write such a wrapper function with repeated arguments?

推荐答案

scala> def foo(args: Array[String]) = for(arg <- args) println(arg)
foo: (args: Array[String])Unit

scala> def bar(args: String*) = foo(args.toArray)
bar: (args: String*)Unit

scala> bar("hello", "world")
hello
world

您需要执行上述转换,因为 Scala 中的 varargs 实现为 Seq,而不是 Array.

You need to perform above conversion because varargs in Scala are implemented as Seq, not Array.

以下是在 Scala 中通常如何转发可变参数:

Here is how varargs are usually forwarded in Scala:

scala> def fooV(args: String*) = args foreach println
fooV: (args: String*)Unit

scala> def fooS(args: Seq[String]) = fooV(args: _*)
fooS: (args: Seq[String])Unit

scala> def bar(args: String*) = fooV(args: _*)
bar: (args: String*)Unit

scala> def barS(args: Seq[String]) = args foreach println
barS: (args: Seq[String])Unit

scala> def barV(args: String*) = barS(args)
barV: (args: String*)Unit

scala> def barV(args: String*) = barS(args.toSeq)
barV: (args: String*)Unit

这篇关于如何在 Scala 中转发重复的参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆