Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

groovy: how to pass varargs and closure in same time to a method?

Given following groovy function:

def foo(List<String> params, Closure c) {...}

The method call would be:

foo(['a', 'b', 'c']) { print "bar" }

But I would like to get rid of brackets (List) in the function call. something like:

foo('a', 'b') { print "bar" }

I cannot change the list parameter to varargs because varargs can be only the last parameter in function (here the closure is the last one).

Any suggestion?

like image 454
mhshams Avatar asked Dec 10 '14 16:12

mhshams


2 Answers

There's always Poor Man's Varargs™

def foo(String p1,                                  Closure c) {foo [p1],             c}
def foo(String p1, String p2,                       Closure c) {foo [p1, p2],         c}
def foo(String p1, String p2, String p3,            Closure c) {foo [p1, p2, p3],     c}
def foo(String p1, String p2, String p3, String p4, Closure c) {foo [p1, p2, p3, p4], c}
...

I'm only half joking.

like image 100
Tobia Avatar answered Oct 01 '22 14:10

Tobia


Seeing that it's impossible to achieve exactly what you want (it's written in Groovy documentation that your specific case is a problem, unfortunately they are migrating the docs so I can't directly link right now), what about something along these lines:

def foo(String... params) {
    println params
    return { Closure c ->
        c.call()
    }
}

foo('a', 'b') ({ println 'woot' })

Now you need to put the closure in parantheses, but you don't need to use an array anymore..

like image 39
Gregor Petrin Avatar answered Oct 01 '22 13:10

Gregor Petrin