In scala can I pass repeated parameters to other methods?

15,991

Java makes an assumption that you want to automatically convert the Array args to varargs, but this can be problematic with methods that accept varargs of type Object.

Scala requires that you be explicit, by ascribing the argument with : _*.

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

You can use : _* on any subtype of Seq, or on anything implicitly convertable to a Seq, notably 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

It is explained well with examples in the Language Reference, in section 4.6.2.

Note that these examples are made with Scala 2.8.0.RC2.

Share:
15,991
Fred Haslam
Author by

Fred Haslam

Once upon a time I wrote computer games. Now I just play around with neural networks. Fun stuff!

Updated on June 27, 2022

Comments

  • Fred Haslam
    Fred Haslam almost 2 years

    Here is something I can do in java, take the results of a repeated parameter and pass it to another method:

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

    In scala it would look like this:

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

    But this won't compile, the bar signature expects a series of individual strings, and the args passed in is some non-string structure.

    For now I'm just passing around arrays. It would be very nice to use starred parameters. Is there some way to do it?