Given the following function with optional parameters:
def foo(a:Int = 1, b:Int = 2, c:Int = 3) ...
I want to keep the default value of a but pass new values to b and c only by positional assignment (rather than by a named assignment), that is any of the following syntaxes would be nice:
foo( , 5, 7)
foo(_, 5, 7)
Is something like that possible with Scala?
There's no way to skip the parameters, but you can use named parameters when you call your foo
method, for example:
// Call foo with b = 5, c = 7 and the default value for a
foo(b = 5, c = 7)
edit - You asked specifically how to do this by positional assignment: this is not possible in Scala.
You can create another function, with one of the parameters applied.
def long(a: Int = 1, b: Int = 2, c: Int = 3) = a + b + c
def short(x: Int, y: Int) = long(b = x, c = y)
val s = short(10, 20) // s: Int = 31
A solution (far from pretty) could be Currying
You would need to change the method signature a little bit:
// Just for "a" parameter
def foo(a: Int = 1)(b: Int = 2, c: Int = 3)
foo()(2,3) // 6
foo(1)(2,3) // 6
foo(2)(2,3) // 7
For all the parameters:
def foo(a: Int = 1)(b: Int = 2)(c: Int = 3) = a + b + c
foo()()(3) // 6
foo()(2)(3) // 6
foo(2)()(3) // 7
foo(3)()(3) // 8
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With