Ruby, Python, and many other dynamic languages have a so-called splat operator that lets you easily invoke a function by providing a list of argument values:
def f(x,y)
x*y
end
> fArgs = [6,7.0]
=> [6, 7.0]
> f(*fArgs)
=> 42.0
Scala does not have a splat operator per se, but you can achieve the same effect without too much work. Sadly the syntax is different for fixed-arity and variadic functions.
Scala splat for variadic functions
For variadic functions there effectively is a splat operator. If you invoke a variadic function and append :_*
to the argument the compiler will perform the splat:
> def g(xs:Int*) = (0 /: xs) (_ + _)
g: (xs: Int*)Int
> val gArgs = List(1,2,3,4)
gArgs: List[Int] = List(1, 2, 3, 4)
> g(gArgs:_*)
res23: Int = 10
Scala splat for fixed-arity functions
> def f(x:Int, y:Double) = x * y
f: (x: Int, y: Double)Double
> val fArgs = (6, 7.0)
fArgs: (Int, Double) = (6,7.0)
> f _ tupled fArgs
res8: Double = 42.0
Magic! The first part, f _
, is the syntax for a partially applied function in which none of the arguments have been specified. This works as a mechanism to get a hold of the function object. tupled
returns a new function which of arity-1 that takes a single arity-n tuple. It is defined in the Scala Function object,
However, given a List of arguments to pass to f, I’m not sure how to easily convert the List to a Tuple.
p.s. There’s a stackoverflow post about this called “scala tuple unpacking.”