Reputation: 2123
Is there a way to use anonymous code blocks in Groovy? For example, I'm trying to translate the following Java code into Groovy:
{
int i = 0;
System.out.println(i);
}
int i = 10;
System.out.println(i);
The closest translation I can come up with is the following:
boolean groovyIsLame = true
if (groovyIsLame) {
int i = 0
println i
}
int i = 10
println i
I know anonymous code blocks are often kind of an antipattern. But having variables with names like "inputStream0" and "inputStream1" is an antipattern too, so for this code I'm working on, anonymous code blocks would be helpful.
Upvotes: 16
Views: 19842
Reputation: 3402
Why not just add if(true)
if(true) {
int i = 0;
System.out.println(i);
}
int i = 10;
System.out.println(i);
Upvotes: 1
Reputation: 9563
The most common need for an anonymous block is for additional (possibly shadowing) bindings using def
. One option is to create a dictionary equivalent of your bindings and use .with
. Using the example given in the question:
[i:0].with {
println i
}
int i = 10
println i
This gives you a lisp styled let
block
Upvotes: 0
Reputation: 199314
What about:
({
int i = 0
println i
}).()
int i = 10
println i
I don't have a Groovy installation at hand, but that should do.
Upvotes: 2
Reputation: 26049
You can use anonymous code blocks in Groovy but the syntax is ambiguous between those and closures. If you try to run this you actually get this error:
Ambiguous expression could be either a parameterless closure expression or an isolated open code block; solution: Add an explicit closure parameter list, e.g. {it -> ...}, or force it to be treated as an open block by giving it a label, e.g. L:{...} at line: 1, column: 1
Following the suggestion, you can use a label and it will allow you to use the anonymous code block. Rewriting your Java code in Groovy:
l: {
int i = 0
println i
}
int i = 10
println i
Upvotes: 18
Reputation: 346466
In Groovy, those braces constitute a closure literal. So, no can do. Personally, I'd consider having to give up anonymous blocks for getting closures a very good deal.
Upvotes: 1