在scala中,我可以将重复参数传递给其他方法吗?

Fre*_*lam 30 parameters methods scala variadic-functions

这是我可以在java中做的事情,获取重复参数的结果并将其传递给另一个方法:

public void foo(String ... args){bar(args);}
public void bar(String ... args){System.out.println("count="+args.length);}
Run Code Online (Sandbox Code Playgroud)

在scala中它看起来像这样:

def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)
Run Code Online (Sandbox Code Playgroud)

但这不会编译,bar签名需要一系列单独的字符串,而传入的args是一些非字符串结构.

现在我只是绕过阵列.使用星号参数会非常好.有办法吗?

ret*_*nym 48

Java假设您希望自动将Array转换args为varargs,但这对于接受Object类型的v​​arargs的方法可能会有问题.

Scala要求您明确,通过将参数归为: _*.

scala> def bar(args:String*) = println("count="+args.length)
bar: (args: String*)Unit

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

scala> foo("1", "2")
count=2
Run Code Online (Sandbox Code Playgroud)

您可以使用: _*在任何亚型Seq,或任何隐含可转化到Seq,尤其是Array.

scala> def foo(is: Int*) = is.length
foo: (is: Int*)Int

scala> foo(1, 2, 3)
res0: Int = 3

scala> foo(Seq(1, 2, 3): _*)
res1: Int = 3

scala> foo(List(1, 2, 3): _*)
res2: Int = 3

scala> foo(Array(1, 2, 3): _*)
res3: Int = 3

scala> import collection.JavaConversions._
import collection.JavaConversions._

scala> foo(java.util.Arrays.asList(1, 2, 3): _*)
res6: Int = 3
Run Code Online (Sandbox Code Playgroud)

" 语言参考"的 4.6.2节中的示例对此进行了解释.

请注意,这些示例是使用Scala 2.8.0.RC2制作的.