pythonscalaargument-passing

Is there a Scala equivalent of the Python list unpack (a.k.a. "*") operator?


In Python, we have the star (or "*" or "unpack") operator, that allows us to unpack a list for convenient use in passing positional arguments. For example:

range(3, 6)
args = [3, 6]
# invokes range(3, 6)
range(*args)

In this particular example, it doesn't save much typing, since range only takes two arguments. But you can imagine that if there were more arguments to range, or if args was read from an input source, returned from another function, etc. then this could come in handy.

In Scala, I haven't been able to find an equivalent. Consider the following commands run in a Scala interactive session:

case class ThreeValues(one: String, two: String, three: String)

//works fine
val x = ThreeValues("1","2","3")

val argList = List("one","two","three")

//also works
val y = ThreeValues(argList(0), argList(1), argList(2))

//doesn't work, obviously
val z = ThreeValues(*argList)

Is there a more concise way to do this besides the method used in val y?


Solution

  • There is something similar for functiones: tupled It converts a function that takes n parameters into a function that takes one argument of type n-tuple.

    See this question for more information: scala tuple unpacking

    Such a method for arrays wouldn't make much sense, because it would only work with functions with multiple arguments of same type.