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

时间:2010-05-14 16:46:44

标签: scala parameters methods variadic-functions

以下是我可以在java中执行的操作,获取重复参数的结果并将其传递给另一个方法:

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

在scala中,它看起来像这样:

def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)

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

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

1 个答案:

答案 0 :(得分:47)

Java假设您要自动将数组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

您可以在: _*的任何子类型上使用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

{{1}}

第{4.6.1节中的Language Reference中的例子很好地解释了这一点。

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