piepera
piepera

Reputation: 2123

Anonymous code blocks in Groovy

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

Answers (6)

Iceberg
Iceberg

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

Marty Neal
Marty Neal

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

Bob Herrmann
Bob Herrmann

Reputation: 9928

1.times {
    // I'm like a block.
}

Upvotes: 8

OscarRyz
OscarRyz

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

Chris Dail
Chris Dail

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

Michael Borgwardt
Michael Borgwardt

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

Related Questions